Skip to content

Commit 05da191

Browse files
authored
Non deserializable activity arguments should cause activity failure (#381)
1 parent 25cc83d commit 05da191

File tree

4 files changed

+72
-3
lines changed

4 files changed

+72
-3
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,9 @@ public ActivityTaskHandler.Result execute(ActivityTaskImpl task, Scope metricsSc
202202
ActivityExecutionContext context =
203203
new ActivityExecutionContextImpl(service, domain, task, dataConverter, heartbeatExecutor);
204204
byte[] input = task.getInput();
205-
Object[] args = dataConverter.fromDataArray(input, method.getGenericParameterTypes());
206205
CurrentActivityExecutionContext.set(context);
207206
try {
207+
Object[] args = dataConverter.fromDataArray(input, method.getGenericParameterTypes());
208208
Object result = method.invoke(activity, args);
209209
RespondActivityTaskCompletedRequest request = new RespondActivityTaskCompletedRequest();
210210
if (context.isDoNotCompleteOnReturn()) {
@@ -239,8 +239,8 @@ public ActivityTaskHandler.Result execute(ActivityTaskImpl task, Scope metricsSc
239239
new LocalActivityExecutionContextImpl(service, domain, task);
240240
CurrentActivityExecutionContext.set(context);
241241
byte[] input = task.getInput();
242-
Object[] args = dataConverter.fromDataArray(input, method.getGenericParameterTypes());
243242
try {
243+
Object[] args = dataConverter.fromDataArray(input, method.getGenericParameterTypes());
244244
Object result = method.invoke(activity, args);
245245
RespondActivityTaskCompletedRequest request = new RespondActivityTaskCompletedRequest();
246246
if (method.getReturnType() != Void.TYPE) {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,10 @@ public static ActivityStub newUntypedActivityStub(ActivityOptions options) {
169169
return ActivityStubImpl.newInstance(options, getWorkflowInterceptor());
170170
}
171171

172+
public static ActivityStub newUntypedLocalActivityStub(LocalActivityOptions options) {
173+
return LocalActivityStubImpl.newInstance(options, getWorkflowInterceptor());
174+
}
175+
172176
@SuppressWarnings("unchecked")
173177
public static <T> T newChildWorkflowStub(
174178
Class<T> workflowInterface, ChildWorkflowOptions options) {

src/main/java/com/uber/cadence/workflow/Workflow.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ public static <T> T newActivityStub(Class<T> activityInterface) {
389389
}
390390

391391
/**
392-
* Creates client stub to activities that implement given interface.
392+
* Creates non typed client stub to activities. Allows executing activities by their string name.
393393
*
394394
* @param options specify the activity invocation parameters.
395395
*/
@@ -422,6 +422,16 @@ public static <T> T newLocalActivityStub(Class<T> activityInterface) {
422422
return WorkflowInternal.newLocalActivityStub(activityInterface, null);
423423
}
424424

425+
/**
426+
* Creates non typed client stub to local activities. Allows executing activities by their string
427+
* name.
428+
*
429+
* @param options specify the local activity invocation parameters.
430+
*/
431+
public static ActivityStub newUntypedLocalActivityStub(LocalActivityOptions options) {
432+
return WorkflowInternal.newUntypedLocalActivityStub(options);
433+
}
434+
425435
/**
426436
* Creates client stub that can be used to start a child workflow that implements the given
427437
* interface using parent options. Use {@link #newExternalWorkflowStub(Class, String)} to get a

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

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4447,6 +4447,61 @@ public void testNonSerializableExceptionInActivity() {
44474447
assertTrue(result.contains("NonSerializableException"));
44484448
}
44494449

4450+
public interface NonDeserializableArgumentsActivity {
4451+
4452+
@ActivityMethod(scheduleToCloseTimeoutSeconds = 5)
4453+
void execute(int arg);
4454+
}
4455+
4456+
public static class NonDeserializableExceptionActivityImpl
4457+
implements NonDeserializableArgumentsActivity {
4458+
4459+
@Override
4460+
public void execute(int arg) {}
4461+
}
4462+
4463+
public static class TestNonSerializableArgumentsInActivityWorkflow implements TestWorkflow1 {
4464+
4465+
@Override
4466+
public String execute(String taskList) {
4467+
StringBuilder result = new StringBuilder();
4468+
ActivityStub activity =
4469+
Workflow.newUntypedActivityStub(
4470+
new ActivityOptions.Builder()
4471+
.setScheduleToCloseTimeout(Duration.ofSeconds(5))
4472+
.build());
4473+
ActivityStub localActivity =
4474+
Workflow.newUntypedLocalActivityStub(
4475+
new LocalActivityOptions.Builder()
4476+
.setScheduleToCloseTimeout(Duration.ofSeconds(5))
4477+
.build());
4478+
try {
4479+
activity.execute("NonDeserializableArgumentsActivity::execute", Void.class, "boo");
4480+
} catch (ActivityFailureException e) {
4481+
result.append(e.getCause().getClass().getSimpleName());
4482+
}
4483+
result.append("-");
4484+
try {
4485+
localActivity.execute("NonDeserializableArgumentsActivity::execute", Void.class, "boo");
4486+
} catch (ActivityFailureException e) {
4487+
result.append(e.getCause().getClass().getSimpleName());
4488+
}
4489+
return result.toString();
4490+
}
4491+
}
4492+
4493+
@Test
4494+
public void testNonSerializableArgumentsInActivity() {
4495+
worker.registerActivitiesImplementations(new NonDeserializableExceptionActivityImpl());
4496+
startWorkerFor(TestNonSerializableArgumentsInActivityWorkflow.class);
4497+
TestWorkflow1 workflowStub =
4498+
workflowClient.newWorkflowStub(
4499+
TestWorkflow1.class, newWorkflowOptionsBuilder(taskList).build());
4500+
4501+
String result = workflowStub.execute(taskList);
4502+
assertEquals("DataConverterException-DataConverterException", result);
4503+
}
4504+
44504505
public interface NonSerializableExceptionChildWorkflow {
44514506

44524507
@WorkflowMethod

0 commit comments

Comments
 (0)