Skip to content

Commit 8c61213

Browse files
Support feature flags in java client (#619)
1 parent c06ec9e commit 8c61213

File tree

8 files changed

+152
-9
lines changed

8 files changed

+152
-9
lines changed

src/main/idls

Submodule idls updated from 7d2d225 to d9811d5

src/main/java/com/uber/cadence/internal/metrics/ServiceMethod.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
public class ServiceMethod {
2121
public static final String DEPRECATE_DOMAIN =
2222
MetricsType.CADENCE_METRICS_PREFIX + "DeprecateDomain";
23+
public static final String GET_TASK_LISTS_BY_DOMAIN =
24+
MetricsType.CADENCE_METRICS_PREFIX + "GetTaskListsByDomain";
2325
public static final String DESCRIBE_DOMAIN =
2426
MetricsType.CADENCE_METRICS_PREFIX + "DescribeDomain";
2527
public static final String LIST_DOMAINS = MetricsType.CADENCE_METRICS_PREFIX + "ListDomains";

src/main/java/com/uber/cadence/internal/sync/TestActivityEnvironmentInternal.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
import com.google.common.base.Defaults;
2121
import com.uber.cadence.*;
22+
import com.uber.cadence.GetTaskListsByDomainRequest;
23+
import com.uber.cadence.GetTaskListsByDomainResponse;
2224
import com.uber.cadence.activity.ActivityOptions;
2325
import com.uber.cadence.activity.LocalActivityOptions;
2426
import com.uber.cadence.internal.metrics.NoopScope;
@@ -585,6 +587,13 @@ public void DeprecateDomain(
585587
impl.DeprecateDomain(deprecateRequest, resultHandler);
586588
}
587589

590+
@Override
591+
public void GetTaskListsByDomain(
592+
GetTaskListsByDomainRequest request, AsyncMethodCallback resultHandler)
593+
throws org.apache.thrift.TException {
594+
impl.GetTaskListsByDomain(request, resultHandler);
595+
}
596+
588597
@Override
589598
public void StartWorkflowExecution(
590599
StartWorkflowExecutionRequest startRequest, AsyncMethodCallback resultHandler)
@@ -861,10 +870,18 @@ public UpdateDomainResponse UpdateDomain(UpdateDomainRequest updateRequest)
861870

862871
@Override
863872
public void DeprecateDomain(DeprecateDomainRequest deprecateRequest)
864-
throws BadRequestError, InternalServiceError, EntityNotExistsError, TException {
873+
throws BadRequestError, EntityNotExistsError, LimitExceededError, ServiceBusyError,
874+
ClientVersionNotSupportedError, TException {
865875
impl.DeprecateDomain(deprecateRequest);
866876
}
867877

878+
@Override
879+
public GetTaskListsByDomainResponse GetTaskListsByDomain(GetTaskListsByDomainRequest request)
880+
throws BadRequestError, EntityNotExistsError, LimitExceededError, ServiceBusyError,
881+
ClientVersionNotSupportedError, TException {
882+
return impl.GetTaskListsByDomain(request);
883+
}
884+
868885
@Override
869886
public StartWorkflowExecutionResponse StartWorkflowExecution(
870887
StartWorkflowExecutionRequest startRequest)

src/main/java/com/uber/cadence/internal/sync/TestWorkflowEnvironmentInternal.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.uber.cadence.internal.sync;
1919

2020
import com.uber.cadence.BadRequestError;
21+
import com.uber.cadence.ClientVersionNotSupportedError;
2122
import com.uber.cadence.ClusterInfo;
2223
import com.uber.cadence.CountWorkflowExecutionsRequest;
2324
import com.uber.cadence.CountWorkflowExecutionsResponse;
@@ -31,9 +32,12 @@
3132
import com.uber.cadence.DomainAlreadyExistsError;
3233
import com.uber.cadence.EntityNotExistsError;
3334
import com.uber.cadence.GetSearchAttributesResponse;
35+
import com.uber.cadence.GetTaskListsByDomainRequest;
36+
import com.uber.cadence.GetTaskListsByDomainResponse;
3437
import com.uber.cadence.GetWorkflowExecutionHistoryRequest;
3538
import com.uber.cadence.GetWorkflowExecutionHistoryResponse;
3639
import com.uber.cadence.InternalServiceError;
40+
import com.uber.cadence.LimitExceededError;
3741
import com.uber.cadence.ListArchivedWorkflowExecutionsRequest;
3842
import com.uber.cadence.ListArchivedWorkflowExecutionsResponse;
3943
import com.uber.cadence.ListClosedWorkflowExecutionsRequest;
@@ -453,6 +457,13 @@ public void DeprecateDomain(
453457
impl.DeprecateDomain(deprecateRequest, resultHandler);
454458
}
455459

460+
@Override
461+
public void GetTaskListsByDomain(
462+
GetTaskListsByDomainRequest request, AsyncMethodCallback resultHandler)
463+
throws org.apache.thrift.TException {
464+
impl.GetTaskListsByDomain(request, resultHandler);
465+
}
466+
456467
@Override
457468
public void StartWorkflowExecution(
458469
StartWorkflowExecutionRequest startRequest, AsyncMethodCallback resultHandler)
@@ -738,6 +749,13 @@ public void DeprecateDomain(DeprecateDomainRequest deprecateRequest)
738749
impl.DeprecateDomain(deprecateRequest);
739750
}
740751

752+
@Override
753+
public GetTaskListsByDomainResponse GetTaskListsByDomain(GetTaskListsByDomainRequest request)
754+
throws BadRequestError, EntityNotExistsError, LimitExceededError, ServiceBusyError,
755+
ClientVersionNotSupportedError, TException {
756+
return impl.GetTaskListsByDomain(request);
757+
}
758+
741759
@Override
742760
public StartWorkflowExecutionResponse StartWorkflowExecution(
743761
StartWorkflowExecutionRequest startRequest)

src/main/java/com/uber/cadence/internal/testservice/TestWorkflowService.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import com.uber.cadence.DomainNotActiveError;
3434
import com.uber.cadence.EntityNotExistsError;
3535
import com.uber.cadence.GetSearchAttributesResponse;
36+
import com.uber.cadence.GetTaskListsByDomainRequest;
37+
import com.uber.cadence.GetTaskListsByDomainResponse;
3638
import com.uber.cadence.GetWorkflowExecutionHistoryRequest;
3739
import com.uber.cadence.GetWorkflowExecutionHistoryResponse;
3840
import com.uber.cadence.InternalServiceError;
@@ -210,6 +212,13 @@ public void DeprecateDomain(DeprecateDomainRequest deprecateRequest)
210212
throw new UnsupportedOperationException("not implemented");
211213
}
212214

215+
@Override
216+
public GetTaskListsByDomainResponse GetTaskListsByDomain(GetTaskListsByDomainRequest request)
217+
throws BadRequestError, EntityNotExistsError, LimitExceededError, ServiceBusyError,
218+
ClientVersionNotSupportedError, TException {
219+
throw new UnsupportedOperationException("not implemented");
220+
}
221+
213222
@Override
214223
public StartWorkflowExecutionResponse StartWorkflowExecution(
215224
StartWorkflowExecutionRequest startRequest) throws TException {
@@ -795,6 +804,13 @@ public void DeprecateDomain(
795804
throw new UnsupportedOperationException("not implemented");
796805
}
797806

807+
@Override
808+
public void GetTaskListsByDomain(
809+
GetTaskListsByDomainRequest request, AsyncMethodCallback resultHandler)
810+
throws org.apache.thrift.TException {
811+
throw new UnsupportedOperationException("not implemented");
812+
}
813+
798814
@Override
799815
public void StartWorkflowExecution(
800816
StartWorkflowExecutionRequest startRequest, AsyncMethodCallback resultHandler)

src/main/java/com/uber/cadence/serviceclient/ClientOptions.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import com.google.common.base.Strings;
2121
import com.google.common.collect.ImmutableMap;
22+
import com.uber.cadence.FeatureFlags;
2223
import com.uber.cadence.internal.metrics.NoopScope;
2324
import com.uber.m3.tally.Scope;
2425
import java.util.Map;
@@ -76,6 +77,9 @@ public class ClientOptions {
7677

7778
private static final ClientOptions DEFAULT_INSTANCE;
7879

80+
/** Optional Feature flags to turn on/off some Cadence features */
81+
private final FeatureFlags featureFlags;
82+
7983
static {
8084
DEFAULT_INSTANCE = new Builder().build();
8185
}
@@ -123,6 +127,8 @@ private ClientOptions(Builder builder) {
123127
this.transportHeaders = ImmutableMap.of();
124128
}
125129

130+
this.featureFlags = builder.featureFlags;
131+
126132
if (builder.headers != null) {
127133
this.headers = ImmutableMap.copyOf(builder.headers);
128134
} else {
@@ -179,6 +185,10 @@ public Map<String, String> getHeaders() {
179185
return headers;
180186
}
181187

188+
public FeatureFlags getFeatureFlags() {
189+
return this.featureFlags;
190+
}
191+
182192
/**
183193
* Builder is the builder for ClientOptions.
184194
*
@@ -197,6 +207,7 @@ public static class Builder {
197207
private Scope metricsScope;
198208
private Map<String, String> transportHeaders;
199209
private Map<String, String> headers;
210+
private FeatureFlags featureFlags;
200211

201212
private Builder() {}
202213

@@ -252,6 +263,22 @@ public Builder setListArchivedWorkflowRpcTimeout(long timeoutMillis) {
252263
return this;
253264
}
254265

266+
/**
267+
* Sets the feature flags to turn on/off some Cadence features By default, all features under
268+
* FeatureFlags are turned off.
269+
*
270+
* @param featureFlags FeatureFlags
271+
*/
272+
public Builder setFeatureFlags(FeatureFlags featureFlags) {
273+
this.featureFlags = featureFlags;
274+
return this;
275+
}
276+
277+
/** Returns the feature flags defined in ClientOptions */
278+
public FeatureFlags getFeatureFlags() {
279+
return this.featureFlags;
280+
}
281+
255282
/**
256283
* Sets the client application name.
257284
*

src/main/java/com/uber/cadence/serviceclient/WorkflowServiceTChannel.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
package com.uber.cadence.serviceclient;
1919

2020
import com.google.common.collect.ImmutableMap;
21+
import com.google.gson.Gson;
22+
import com.google.gson.GsonBuilder;
2123
import com.uber.cadence.BadRequestError;
2224
import com.uber.cadence.ClientVersionNotSupportedError;
2325
import com.uber.cadence.ClusterInfo;
@@ -34,6 +36,8 @@
3436
import com.uber.cadence.DomainNotActiveError;
3537
import com.uber.cadence.EntityNotExistsError;
3638
import com.uber.cadence.GetSearchAttributesResponse;
39+
import com.uber.cadence.GetTaskListsByDomainRequest;
40+
import com.uber.cadence.GetTaskListsByDomainResponse;
3741
import com.uber.cadence.GetWorkflowExecutionHistoryRequest;
3842
import com.uber.cadence.GetWorkflowExecutionHistoryResponse;
3943
import com.uber.cadence.History;
@@ -203,6 +207,13 @@ private static Map<String, String> getThriftHeaders(ClientOptions options) {
203207
}
204208
}
205209

210+
if (options.getFeatureFlags() != null) {
211+
GsonBuilder gsonBuilder = new GsonBuilder();
212+
Gson gson = gsonBuilder.create();
213+
String serialized = gson.toJson(options.getFeatureFlags());
214+
builder.put("cadence-client-feature-flags", serialized);
215+
}
216+
206217
return builder.build();
207218
}
208219

@@ -550,6 +561,51 @@ private void deprecateDomain(DeprecateDomainRequest deprecateRequest) throws TEx
550561
}
551562
}
552563

564+
@Override
565+
public GetTaskListsByDomainResponse GetTaskListsByDomain(
566+
GetTaskListsByDomainRequest getTaskListsByDomainRequest) throws TException {
567+
return measureRemoteCall(
568+
ServiceMethod.GET_TASK_LISTS_BY_DOMAIN,
569+
() -> getTaskListsByDomain(getTaskListsByDomainRequest));
570+
}
571+
572+
private GetTaskListsByDomainResponse getTaskListsByDomain(
573+
GetTaskListsByDomainRequest getTaskListsByDomainRequest) throws TException {
574+
ThriftResponse<WorkflowService.GetTaskListsByDomain_result> response = null;
575+
try {
576+
ThriftRequest<WorkflowService.GetTaskListsByDomain_args> request =
577+
buildThriftRequest(
578+
"GetTaskListsByDomain",
579+
new WorkflowService.GetTaskListsByDomain_args(getTaskListsByDomainRequest));
580+
response = doRemoteCall(request);
581+
WorkflowService.GetTaskListsByDomain_result result =
582+
response.getBody(WorkflowService.GetTaskListsByDomain_result.class);
583+
if (response.getResponseCode() == ResponseCode.OK) {
584+
return result.getSuccess();
585+
}
586+
if (result.isSetBadRequestError()) {
587+
throw result.getBadRequestError();
588+
}
589+
if (result.isSetEntityNotExistError()) {
590+
throw result.getEntityNotExistError();
591+
}
592+
if (result.isSetLimitExceededError()) {
593+
throw result.getLimitExceededError();
594+
}
595+
if (result.isSetServiceBusyError()) {
596+
throw result.getServiceBusyError();
597+
}
598+
if (result.isSetClientVersionNotSupportedError()) {
599+
throw result.getClientVersionNotSupportedError();
600+
}
601+
throw new TException("GetTaskListsByDomain failed with unknown error:" + result);
602+
} finally {
603+
if (response != null) {
604+
response.release();
605+
}
606+
}
607+
}
608+
553609
@Override
554610
public StartWorkflowExecutionResponse StartWorkflowExecution(
555611
StartWorkflowExecutionRequest request) throws TException {
@@ -2593,4 +2649,11 @@ public void DeprecateDomain(
25932649
throws TException {
25942650
throw new UnsupportedOperationException("not implemented");
25952651
}
2652+
2653+
@Override
2654+
public void GetTaskListsByDomain(
2655+
GetTaskListsByDomainRequest request, AsyncMethodCallback resultHandler)
2656+
throws org.apache.thrift.TException {
2657+
throw new UnsupportedOperationException("not implemented");
2658+
}
25962659
}

src/test/java/com/uber/cadence/workflow/WorkflowTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.uber.cadence.DomainAlreadyExistsError;
3636
import com.uber.cadence.DomainNotActiveError;
3737
import com.uber.cadence.EntityNotExistsError;
38+
import com.uber.cadence.FeatureFlags;
3839
import com.uber.cadence.GetWorkflowExecutionHistoryResponse;
3940
import com.uber.cadence.HistoryEvent;
4041
import com.uber.cadence.Memo;
@@ -206,7 +207,11 @@ protected void failed(Throwable e, Description description) {
206207
private ScheduledExecutorService scheduledExecutor;
207208
private List<ScheduledFuture<?>> delayedCallbacks = new ArrayList<>();
208209
private static final IWorkflowService service =
209-
new WorkflowServiceTChannel(ClientOptions.defaultInstance());
210+
new WorkflowServiceTChannel(
211+
ClientOptions.newBuilder()
212+
.setFeatureFlags(
213+
new FeatureFlags().setWorkflowExecutionAlreadyCompletedErrorEnabled(true))
214+
.build());
210215

211216
@AfterClass
212217
public static void closeService() {
@@ -2501,12 +2506,7 @@ public void testSignalingCompletedWorkflow() {
25012506
client.mySignal("Hello!");
25022507
assert (false); // Signal call should throw an exception, so fail if it doesn't
25032508
} catch (Exception e) {
2504-
if (e.getCause().getClass() != WorkflowExecutionAlreadyCompletedError.class
2505-
&& e.getCause().getClass() != EntityNotExistsError.class // only for legacy servers
2506-
) {
2507-
// Using assertEquals to output the actual error
2508-
assertEquals(WorkflowExecutionAlreadyCompletedError.class, e.getCause().getClass());
2509-
}
2509+
assertEquals(WorkflowExecutionAlreadyCompletedError.class, e.getCause().getClass());
25102510
}
25112511
}
25122512

0 commit comments

Comments
 (0)