23
23
import io .grpc .*;
24
24
import io .temporal .api .workflowservice .v1 .GetSystemInfoRequest ;
25
25
import io .temporal .api .workflowservice .v1 .GetSystemInfoResponse ;
26
+ import io .temporal .api .workflowservice .v1 .GetSystemInfoResponse .Capabilities ;
26
27
import io .temporal .api .workflowservice .v1 .WorkflowServiceGrpc ;
28
+ import io .temporal .internal .retryer .GrpcRetryer ;
29
+ import io .temporal .internal .retryer .GrpcRetryer .GrpcRetryerOptions ;
30
+ import java .time .Duration ;
31
+ import java .util .Objects ;
27
32
import java .util .concurrent .CompletableFuture ;
33
+ import java .util .concurrent .TimeUnit ;
34
+ import javax .annotation .Nonnull ;
28
35
import javax .annotation .Nullable ;
29
36
30
37
public class SystemInfoInterceptor implements ClientInterceptor {
31
38
32
- private final CompletableFuture <GetSystemInfoResponse . Capabilities > serverCapabilitiesFuture ;
39
+ private final CompletableFuture <Capabilities > serverCapabilitiesFuture ;
33
40
34
- public SystemInfoInterceptor (
35
- CompletableFuture <GetSystemInfoResponse .Capabilities > serverCapabilitiesFuture ) {
41
+ public SystemInfoInterceptor (CompletableFuture <Capabilities > serverCapabilitiesFuture ) {
36
42
this .serverCapabilitiesFuture = serverCapabilitiesFuture ;
37
43
}
38
44
@@ -63,8 +69,7 @@ public void onMessage(RespT message) {
63
69
@ Override
64
70
public void onClose (Status status , Metadata trailers ) {
65
71
if (Status .UNIMPLEMENTED .getCode ().equals (status .getCode ())) {
66
- serverCapabilitiesFuture .complete (
67
- GetSystemInfoResponse .Capabilities .getDefaultInstance ());
72
+ serverCapabilitiesFuture .complete (Capabilities .getDefaultInstance ());
68
73
}
69
74
super .onClose (status , trailers );
70
75
}
@@ -87,7 +92,39 @@ public void onClose(Status status, Metadata trailers) {
87
92
};
88
93
}
89
94
90
- public static GetSystemInfoResponse .Capabilities getServerCapabilitiesOrThrow (
95
+ public static Capabilities getServerCapabilitiesWithRetryOrThrow (
96
+ @ Nonnull CompletableFuture <Capabilities > future ,
97
+ @ Nonnull Channel channel ,
98
+ @ Nullable Deadline deadline ) {
99
+ Capabilities capabilities = future .getNow (null );
100
+ if (capabilities == null ) {
101
+ synchronized (Objects .requireNonNull (future )) {
102
+ capabilities = future .getNow (null );
103
+ if (capabilities == null ) {
104
+ if (deadline == null ) {
105
+ deadline = Deadline .after (30 , TimeUnit .SECONDS );
106
+ }
107
+ Deadline computedDeadline = deadline ;
108
+ RpcRetryOptions rpcRetryOptions =
109
+ RpcRetryOptions .newBuilder ()
110
+ .setExpiration (
111
+ Duration .ofMillis (computedDeadline .timeRemaining (TimeUnit .MILLISECONDS )))
112
+ .validateBuildWithDefaults ();
113
+ GrpcRetryerOptions grpcRetryerOptions =
114
+ new GrpcRetryerOptions (rpcRetryOptions , computedDeadline );
115
+ capabilities =
116
+ new GrpcRetryer (Capabilities ::getDefaultInstance )
117
+ .retryWithResult (
118
+ () -> getServerCapabilitiesOrThrow (channel , computedDeadline ),
119
+ grpcRetryerOptions );
120
+ future .complete (capabilities );
121
+ }
122
+ }
123
+ }
124
+ return capabilities ;
125
+ }
126
+
127
+ public static Capabilities getServerCapabilitiesOrThrow (
91
128
Channel channel , @ Nullable Deadline deadline ) {
92
129
try {
93
130
return WorkflowServiceGrpc .newBlockingStub (channel )
@@ -96,7 +133,7 @@ public static GetSystemInfoResponse.Capabilities getServerCapabilitiesOrThrow(
96
133
.getCapabilities ();
97
134
} catch (StatusRuntimeException ex ) {
98
135
if (Status .Code .UNIMPLEMENTED .equals (ex .getStatus ().getCode ())) {
99
- return GetSystemInfoResponse . Capabilities .getDefaultInstance ();
136
+ return Capabilities .getDefaultInstance ();
100
137
}
101
138
throw ex ;
102
139
}
0 commit comments