Skip to content

Commit 75e05aa

Browse files
Support feature flags in java client
1 parent 63a34bc commit 75e05aa

File tree

4 files changed

+44
-8
lines changed

4 files changed

+44
-8
lines changed

src/main/idls

Submodule idls updated from b1a9b9e to 7d2d225

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

+27
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

+9
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;
@@ -203,6 +205,13 @@ private static Map<String, String> getThriftHeaders(ClientOptions options) {
203205
}
204206
}
205207

208+
if (options.getFeatureFlags() != null) {
209+
GsonBuilder gsonBuilder = new GsonBuilder();
210+
Gson gson = gsonBuilder.create();
211+
String serialized = gson.toJson(options.getFeatureFlags());
212+
builder.put("cadence-client-feature-flags", serialized);
213+
}
214+
206215
return builder.build();
207216
}
208217

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

+7-7
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;
@@ -205,7 +206,11 @@ protected void failed(Throwable e, Description description) {
205206
private ScheduledExecutorService scheduledExecutor;
206207
private List<ScheduledFuture<?>> delayedCallbacks = new ArrayList<>();
207208
private static final IWorkflowService service =
208-
new WorkflowServiceTChannel(ClientOptions.defaultInstance());
209+
new WorkflowServiceTChannel(
210+
ClientOptions.newBuilder()
211+
.setFeatureFlags(
212+
new FeatureFlags().setWorkflowExecutionAlreadyCompletedErrorEnabled(true))
213+
.build());
209214

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

0 commit comments

Comments
 (0)