1616
1717package com .example .spanner ;
1818
19- //[START mutable_credentials ]
19+ // [START spanner_mutable_credentials ]
2020
2121import com .google .auth .oauth2 .ServiceAccountCredentials ;
2222import com .google .cloud .spanner .Spanner ;
2323import com .google .cloud .spanner .SpannerOptions ;
2424import com .google .cloud .spanner .admin .database .v1 .DatabaseAdminClient ;
2525import com .google .cloud .spanner .connection .MutableCredentials ;
26- import com .google .spanner .admin .database .v1 .DatabaseName ;
27- import com .google .spanner .admin .database .v1 .GetDatabaseDdlResponse ;
2826import java .io .FileInputStream ;
2927import java .io .IOException ;
3028import java .nio .file .Files ;
3331import java .nio .file .attribute .FileTime ;
3432import java .util .concurrent .Executors ;
3533import java .util .concurrent .ScheduledExecutorService ;
34+ import java .util .concurrent .ThreadFactory ;
3635import java .util .concurrent .TimeUnit ;
3736
3837public class MutableCredentialsExample {
3938
40-
4139 static void createClientWithMutableCredentials () throws IOException {
4240 final String credentialsPath = "location_of_service_account_credential_json" ;
4341 Path path = Paths .get (credentialsPath );
4442 // Use an array to hold the mutable lastModifiedTime so it can be accessed in the lambda
45- FileTime [] lastModifiedTime = new FileTime []{ Files .getLastModifiedTime (path ) };
43+ FileTime [] lastModifiedTime = new FileTime [] { Files .getLastModifiedTime (path )};
4644
4745 // 1 - create service account credentials
4846 ServiceAccountCredentials serviceAccountCredentials ;
@@ -54,32 +52,40 @@ static void createClientWithMutableCredentials() throws IOException {
5452 MutableCredentials mutableCredentials = new MutableCredentials (serviceAccountCredentials );
5553
5654 // 3 - set credentials on your SpannerOptions builder to your mutableCredentials
57- SpannerOptions options = SpannerOptions .newBuilder ()
58- .setCredentials (mutableCredentials )
59- .build ();
55+ SpannerOptions options = SpannerOptions .newBuilder ().setCredentials (mutableCredentials ).build ();
6056
61- // 4 - include logic for when to how your mutableCredentials
57+ // 4 - include logic for when/how to update your mutableCredentials
6258 // In this example we'll use a SchedulerExecutorService to periodically check for updates
63- ScheduledExecutorService executorService = Executors .newSingleThreadScheduledExecutor ();
64- executorService .scheduleAtFixedRate (() -> {
65- try {
66- FileTime currentModifiedTime = Files .getLastModifiedTime (path );
67- if (currentModifiedTime .compareTo (lastModifiedTime [0 ]) > 0 ) {
68- lastModifiedTime [0 ] = currentModifiedTime ;
69- try (FileInputStream is = new FileInputStream (credentialsPath )) {
70- ServiceAccountCredentials credentials = ServiceAccountCredentials .fromStream (is );
71- mutableCredentials .updateCredentials (credentials );
72- System .out .println ("Credentials rotated." );
59+ ThreadFactory daemonThreadFactory =
60+ runnable -> {
61+ Thread thread = new Thread (runnable , "spanner-mutable-credentials-rotator" );
62+ thread .setDaemon (true );
63+ return thread ;
64+ };
65+ ScheduledExecutorService executorService =
66+ Executors .newSingleThreadScheduledExecutor (daemonThreadFactory );
67+ executorService .scheduleAtFixedRate (
68+ () -> {
69+ try {
70+ FileTime currentModifiedTime = Files .getLastModifiedTime (path );
71+ if (currentModifiedTime .compareTo (lastModifiedTime [0 ]) > 0 ) {
72+ lastModifiedTime [0 ] = currentModifiedTime ;
73+ try (FileInputStream is = new FileInputStream (credentialsPath )) {
74+ ServiceAccountCredentials credentials = ServiceAccountCredentials .fromStream (is );
75+ mutableCredentials .updateCredentials (credentials );
76+ }
77+ }
78+ } catch (IOException e ) {
79+ System .err .println ("Failed to check or update credentials: " + e .getMessage ());
7380 }
74- }
75- } catch (IOException e ) {
76- System .err .println ("Failed to check or update credentials: " + e .getMessage ());
77- }
78- }, 15 , 15 , TimeUnit .MINUTES );
81+ },
82+ 15 ,
83+ 15 ,
84+ TimeUnit .MINUTES );
7985
8086 // 5. Use the client
8187 try (Spanner spanner = options .getService ();
82- DatabaseAdminClient databaseAdminClient = spanner .createDatabaseAdminClient ()) {
88+ DatabaseAdminClient databaseAdminClient = spanner .createDatabaseAdminClient ()) {
8389 // Perform operations...
8490 // long running client operations will always use the latest credentials wrapped in
8591 // mutableCredentials
@@ -89,4 +95,4 @@ static void createClientWithMutableCredentials() throws IOException {
8995 }
9096 }
9197}
92- //[END mutable_credentials ]
98+ // [END spanner_mutable_credentials ]
0 commit comments