Skip to content

Commit 4a32bb1

Browse files
author
Liang Mei
committed
Add ActivityMethod fields back for backward compatibility
1 parent b4db385 commit 4a32bb1

File tree

6 files changed

+94
-14
lines changed

6 files changed

+94
-14
lines changed

src/main/java/com/uber/cadence/activity/ActivityInterface.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@
5555
* }
5656
* </code></pre>
5757
*
58-
* When <code>CImpl</code> instance is registered with the {@link com.uber.cadence.worker.Worker} the
59-
* following activities are registered:
58+
* When <code>CImpl</code> instance is registered with the {@link com.uber.cadence.worker.Worker}
59+
* the following activities are registered:
6060
*
6161
* <p>
6262
*

src/main/java/com/uber/cadence/activity/ActivityMethod.java

+43
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.lang.annotation.Retention;
2222
import java.lang.annotation.RetentionPolicy;
2323
import java.lang.annotation.Target;
24+
import java.time.Duration;
2425

2526
/**
2627
* Indicates that the method is an activity method. This annotation applies only to activity
@@ -32,4 +33,46 @@
3233

3334
/** Name of the workflow type. Default is {short class name}::{method name} */
3435
String name() default "";
36+
37+
/**
38+
* Overall timeout workflow is willing to wait for activity to complete. It includes time in a
39+
* task list (use {@link #scheduleToStartTimeoutSeconds()} to limit it) plus activity execution
40+
* time (use {@link #startToCloseTimeoutSeconds()} to limit it). Either this option or both
41+
* schedule to start and start to close are required.
42+
*
43+
* @deprecated use {@link ActivityOptions.Builder#setScheduleToCloseTimeout(Duration)} instead.
44+
*/
45+
int scheduleToCloseTimeoutSeconds() default 0;
46+
47+
/**
48+
* Time activity can stay in task list before it is picked up by a worker. If schedule to close is
49+
* not provided then both this and start to close are required.
50+
*
51+
* @deprecated use {@link ActivityOptions.Builder#setScheduleToStartTimeout(Duration)} instead.
52+
*/
53+
int scheduleToStartTimeoutSeconds() default 0;
54+
55+
/**
56+
* Maximum activity execution time after it was sent to a worker. If schedule to close is not
57+
* provided then both this and schedule to start are required.
58+
*
59+
* @deprecated use {@link ActivityOptions.Builder#setStartToCloseTimeout(Duration)} instead.
60+
*/
61+
int startToCloseTimeoutSeconds() default 0;
62+
63+
/**
64+
* Heartbeat interval. Activity must heartbeat before this interval passes after a last heartbeat
65+
* or activity start.
66+
*
67+
* @deprecated use {@link ActivityOptions.Builder#setHeartbeatTimeout(Duration)} instead.
68+
*/
69+
int heartbeatTimeoutSeconds() default 0;
70+
71+
/**
72+
* Task list to use when dispatching activity task to a worker. By default it is the same task
73+
* list name the workflow was started with.
74+
*
75+
* @deprecated use {@link ActivityOptions.Builder#setTaskList(String)} instead.
76+
*/
77+
String taskList() default "";
3578
}

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

+31-3
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@
1717

1818
package com.uber.cadence.internal.sync;
1919

20+
import com.google.common.base.Strings;
21+
import com.uber.cadence.activity.ActivityMethod;
2022
import com.uber.cadence.activity.ActivityOptions;
2123
import com.uber.cadence.common.MethodRetry;
2224
import com.uber.cadence.workflow.ActivityStub;
2325
import com.uber.cadence.workflow.WorkflowInterceptor;
2426
import java.lang.reflect.InvocationHandler;
2527
import java.lang.reflect.Method;
28+
import java.time.Duration;
2629
import java.util.function.Function;
2730

2831
class ActivityInvocationHandler extends ActivityInvocationHandlerBase {
@@ -41,12 +44,37 @@ private ActivityInvocationHandler(
4144
init(activityInterface);
4245
}
4346

47+
@SuppressWarnings("deprecation")
4448
@Override
4549
protected Function<Object[], Object> getActivityFunc(
46-
Method method, MethodRetry methodRetry, String activityName) {
50+
Method method, MethodRetry methodRetry, ActivityMethod activityMethod, String activityName) {
4751
Function<Object[], Object> function;
48-
ActivityOptions mergedOptions =
49-
ActivityOptions.newBuilder(options).setMethodRetry(methodRetry).build();
52+
ActivityOptions.Builder optionsBuilder =
53+
ActivityOptions.newBuilder(options).setMethodRetry(methodRetry);
54+
if (activityMethod != null) {
55+
// options always take precedence over activity method annotation.
56+
if (options.getStartToCloseTimeout() == null) {
57+
optionsBuilder.setStartToCloseTimeout(
58+
Duration.ofSeconds(activityMethod.startToCloseTimeoutSeconds()));
59+
}
60+
if (options.getScheduleToStartTimeout() == null) {
61+
optionsBuilder.setScheduleToStartTimeout(
62+
Duration.ofSeconds(activityMethod.scheduleToStartTimeoutSeconds()));
63+
}
64+
if (options.getScheduleToCloseTimeout() == null) {
65+
optionsBuilder.setScheduleToCloseTimeout(
66+
Duration.ofSeconds(activityMethod.scheduleToCloseTimeoutSeconds()));
67+
}
68+
if (options.getHeartbeatTimeout() == null) {
69+
optionsBuilder.setHeartbeatTimeout(
70+
Duration.ofSeconds(activityMethod.heartbeatTimeoutSeconds()));
71+
}
72+
if (Strings.isNullOrEmpty(options.getTaskList())
73+
&& !Strings.isNullOrEmpty(activityMethod.taskList())) {
74+
optionsBuilder.setTaskList(activityMethod.taskList());
75+
}
76+
}
77+
ActivityOptions mergedOptions = optionsBuilder.build();
5078
ActivityStub stub = ActivityStubImpl.newInstance(mergedOptions, activityExecutor);
5179

5280
function =

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ static <T> T newProxy(Class<T> activityInterface, InvocationHandler invocationHa
4747
invocationHandler);
4848
}
4949

50-
protected void init(Class<?> activityInterface) {
50+
void init(Class<?> activityInterface) {
5151
Set<POJOActivityTaskHandler.MethodInterfacePair> activityMethods =
5252
getAnnotatedInterfaceMethodsFromInterface(activityInterface, ActivityInterface.class);
5353
if (activityMethods.isEmpty()) {
@@ -66,7 +66,8 @@ protected void init(Class<?> activityInterface) {
6666
}
6767

6868
MethodRetry methodRetry = method.getAnnotation(MethodRetry.class);
69-
Function<Object[], Object> function = getActivityFunc(method, methodRetry, activityType);
69+
Function<Object[], Object> function =
70+
getActivityFunc(method, methodRetry, activityMethod, activityType);
7071
methodFunctions.put(method, function);
7172
}
7273
}
@@ -81,5 +82,5 @@ public Object invoke(Object proxy, Method method, Object[] args) {
8182
}
8283

8384
protected abstract Function<Object[], Object> getActivityFunc(
84-
Method method, MethodRetry methodRetry, String activityName);
85+
Method method, MethodRetry methodRetry, ActivityMethod activityMethod, String activityName);
8586
}

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

+14-5
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717

1818
package com.uber.cadence.internal.sync;
1919

20+
import com.uber.cadence.activity.ActivityMethod;
2021
import com.uber.cadence.activity.LocalActivityOptions;
2122
import com.uber.cadence.common.MethodRetry;
2223
import com.uber.cadence.workflow.ActivityStub;
2324
import com.uber.cadence.workflow.WorkflowInterceptor;
2425
import java.lang.reflect.InvocationHandler;
2526
import java.lang.reflect.Method;
27+
import java.time.Duration;
2628
import java.util.function.Function;
2729

2830
class LocalActivityInvocationHandler extends ActivityInvocationHandlerBase {
@@ -45,14 +47,21 @@ private LocalActivityInvocationHandler(
4547
init(activityInterface);
4648
}
4749

50+
@SuppressWarnings("deprecation")
4851
@Override
4952
protected Function<Object[], Object> getActivityFunc(
50-
Method method, MethodRetry methodRetry, String activityName) {
53+
Method method, MethodRetry methodRetry, ActivityMethod activityMethod, String activityName) {
5154
Function<Object[], Object> function;
52-
LocalActivityOptions mergedOptions =
53-
LocalActivityOptions.newBuilder(options)
54-
.setMethodRetry(methodRetry)
55-
.validateAndBuildWithDefaults();
55+
LocalActivityOptions.Builder optionsBuilder =
56+
LocalActivityOptions.newBuilder(options).setMethodRetry(methodRetry);
57+
if (activityMethod != null) {
58+
// options always take precedence over activity method annotation.
59+
if (options.getScheduleToCloseTimeout() == null) {
60+
optionsBuilder.setScheduleToCloseTimeout(
61+
Duration.ofSeconds(activityMethod.scheduleToCloseTimeoutSeconds()));
62+
}
63+
}
64+
LocalActivityOptions mergedOptions = optionsBuilder.validateAndBuildWithDefaults();
5665
ActivityStub stub = LocalActivityStubImpl.newInstance(mergedOptions, activityExecutor);
5766
function =
5867
(a) -> stub.execute(activityName, method.getReturnType(), method.getGenericReturnType(), a);

src/test/java/com/uber/cadence/activity/ActivityOptionsTest.java

-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ public void activityAndRetryOptions() {}
4040
@Test
4141
public void testOnlyAnnotationsPresent() throws NoSuchMethodException {
4242
Method method = ActivityOptionsTest.class.getMethod("activityAndRetryOptions");
43-
ActivityMethod a = method.getAnnotation(ActivityMethod.class);
4443
MethodRetry r = method.getAnnotation(MethodRetry.class);
4544
ActivityOptions o = ActivityOptions.newBuilder().build();
4645
ActivityOptions merged = ActivityOptions.newBuilder(o).setMethodRetry(r).build();

0 commit comments

Comments
 (0)