Skip to content

Commit 35e390e

Browse files
Add method to get workflow client from an activity (#2369)
1 parent cf06131 commit 35e390e

File tree

11 files changed

+169
-27
lines changed

11 files changed

+169
-27
lines changed

temporal-sdk/src/main/java/io/temporal/activity/ActivityExecutionContext.java

+7
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import com.uber.m3.tally.Scope;
2424
import io.temporal.client.ActivityCompletionException;
25+
import io.temporal.client.WorkflowClient;
2526
import io.temporal.serviceclient.WorkflowServiceStubsOptions;
2627
import io.temporal.worker.WorkerOptions;
2728
import java.lang.reflect.Type;
@@ -140,4 +141,10 @@ public interface ActivityExecutionContext {
140141
* WorkflowServiceStubsOptions.Builder#setMetricsScope(Scope)} when a worker starts up.
141142
*/
142143
Scope getMetricsScope();
144+
145+
/**
146+
* Get a {@link WorkflowClient} that can be used to start interact with the Temporal service from
147+
* an activity.
148+
*/
149+
WorkflowClient getWorkflowClient();
143150
}

temporal-sdk/src/main/java/io/temporal/common/interceptors/ActivityExecutionContextBase.java

+6
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import io.temporal.activity.ActivityInfo;
2626
import io.temporal.activity.ManualActivityCompletionClient;
2727
import io.temporal.client.ActivityCompletionException;
28+
import io.temporal.client.WorkflowClient;
2829
import java.lang.reflect.Type;
2930
import java.util.Optional;
3031

@@ -85,4 +86,9 @@ public ManualActivityCompletionClient useLocalManualCompletion() {
8586
public Scope getMetricsScope() {
8687
return next.getMetricsScope();
8788
}
89+
90+
@Override
91+
public WorkflowClient getWorkflowClient() {
92+
return next.getWorkflowClient();
93+
}
8894
}

temporal-sdk/src/main/java/io/temporal/internal/activity/ActivityExecutionContextFactoryImpl.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@
2121
package io.temporal.internal.activity;
2222

2323
import com.uber.m3.tally.Scope;
24+
import io.temporal.client.WorkflowClient;
2425
import io.temporal.common.converter.DataConverter;
2526
import io.temporal.internal.client.external.ManualActivityCompletionClientFactory;
26-
import io.temporal.serviceclient.WorkflowServiceStubs;
2727
import java.time.Duration;
2828
import java.util.Objects;
2929
import java.util.concurrent.ScheduledExecutorService;
3030

3131
public class ActivityExecutionContextFactoryImpl implements ActivityExecutionContextFactory {
32-
private final WorkflowServiceStubs service;
32+
private final WorkflowClient client;
3333
private final String identity;
3434
private final String namespace;
3535
private final Duration maxHeartbeatThrottleInterval;
@@ -39,14 +39,14 @@ public class ActivityExecutionContextFactoryImpl implements ActivityExecutionCon
3939
private final ManualActivityCompletionClientFactory manualCompletionClientFactory;
4040

4141
public ActivityExecutionContextFactoryImpl(
42-
WorkflowServiceStubs service,
42+
WorkflowClient client,
4343
String identity,
4444
String namespace,
4545
Duration maxHeartbeatThrottleInterval,
4646
Duration defaultHeartbeatThrottleInterval,
4747
DataConverter dataConverter,
4848
ScheduledExecutorService heartbeatExecutor) {
49-
this.service = Objects.requireNonNull(service);
49+
this.client = Objects.requireNonNull(client);
5050
this.identity = identity;
5151
this.namespace = Objects.requireNonNull(namespace);
5252
this.maxHeartbeatThrottleInterval = Objects.requireNonNull(maxHeartbeatThrottleInterval);
@@ -56,14 +56,14 @@ public ActivityExecutionContextFactoryImpl(
5656
this.heartbeatExecutor = Objects.requireNonNull(heartbeatExecutor);
5757
this.manualCompletionClientFactory =
5858
ManualActivityCompletionClientFactory.newFactory(
59-
service, namespace, identity, dataConverter);
59+
client.getWorkflowServiceStubs(), namespace, identity, dataConverter);
6060
}
6161

6262
@Override
6363
public InternalActivityExecutionContext createContext(
6464
ActivityInfoInternal info, Scope metricsScope) {
6565
return new ActivityExecutionContextImpl(
66-
service,
66+
client,
6767
namespace,
6868
info,
6969
dataConverter,

temporal-sdk/src/main/java/io/temporal/internal/activity/ActivityExecutionContextImpl.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
import io.temporal.activity.ActivityInfo;
2626
import io.temporal.activity.ManualActivityCompletionClient;
2727
import io.temporal.client.ActivityCompletionException;
28+
import io.temporal.client.WorkflowClient;
2829
import io.temporal.common.converter.DataConverter;
2930
import io.temporal.internal.client.external.ManualActivityCompletionClientFactory;
3031
import io.temporal.payload.context.ActivitySerializationContext;
31-
import io.temporal.serviceclient.WorkflowServiceStubs;
3232
import io.temporal.workflow.Functions;
3333
import java.lang.reflect.Type;
3434
import java.time.Duration;
@@ -47,6 +47,7 @@
4747
@ThreadSafe
4848
class ActivityExecutionContextImpl implements InternalActivityExecutionContext {
4949
private final Lock lock = new ReentrantLock();
50+
private final WorkflowClient client;
5051
private final ManualActivityCompletionClientFactory manualCompletionClientFactory;
5152
private final Functions.Proc completionHandle;
5253
private final HeartbeatContext heartbeatContext;
@@ -58,7 +59,7 @@ class ActivityExecutionContextImpl implements InternalActivityExecutionContext {
5859

5960
/** Create an ActivityExecutionContextImpl with the given attributes. */
6061
ActivityExecutionContextImpl(
61-
WorkflowServiceStubs service,
62+
WorkflowClient client,
6263
String namespace,
6364
ActivityInfo info,
6465
DataConverter dataConverter,
@@ -69,13 +70,14 @@ class ActivityExecutionContextImpl implements InternalActivityExecutionContext {
6970
String identity,
7071
Duration maxHeartbeatThrottleInterval,
7172
Duration defaultHeartbeatThrottleInterval) {
73+
this.client = client;
7274
this.metricsScope = metricsScope;
7375
this.info = info;
7476
this.completionHandle = completionHandle;
7577
this.manualCompletionClientFactory = manualCompletionClientFactory;
7678
this.heartbeatContext =
7779
new HeartbeatContextImpl(
78-
service,
80+
client.getWorkflowServiceStubs(),
7981
namespace,
8082
info,
8183
dataConverter,
@@ -170,4 +172,9 @@ public ActivityInfo getInfo() {
170172
public Object getLastHeartbeatValue() {
171173
return heartbeatContext.getLastHeartbeatDetails();
172174
}
175+
176+
@Override
177+
public WorkflowClient getWorkflowClient() {
178+
return client;
179+
}
173180
}

temporal-sdk/src/main/java/io/temporal/internal/activity/LocalActivityExecutionContextFactoryImpl.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,18 @@
2121
package io.temporal.internal.activity;
2222

2323
import com.uber.m3.tally.Scope;
24+
import io.temporal.client.WorkflowClient;
2425

2526
public class LocalActivityExecutionContextFactoryImpl implements ActivityExecutionContextFactory {
27+
private final WorkflowClient client;
2628

27-
public LocalActivityExecutionContextFactoryImpl() {}
29+
public LocalActivityExecutionContextFactoryImpl(WorkflowClient client) {
30+
this.client = client;
31+
}
2832

2933
@Override
3034
public InternalActivityExecutionContext createContext(
3135
ActivityInfoInternal info, Scope metricsScope) {
32-
return new LocalActivityExecutionContextImpl(info, metricsScope);
36+
return new LocalActivityExecutionContextImpl(client, info, metricsScope);
3337
}
3438
}

temporal-sdk/src/main/java/io/temporal/internal/activity/LocalActivityExecutionContextImpl.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,17 @@
2424
import io.temporal.activity.ActivityInfo;
2525
import io.temporal.activity.ManualActivityCompletionClient;
2626
import io.temporal.client.ActivityCompletionException;
27+
import io.temporal.client.WorkflowClient;
2728
import java.lang.reflect.Type;
2829
import java.util.Optional;
2930

3031
class LocalActivityExecutionContextImpl implements InternalActivityExecutionContext {
32+
private final WorkflowClient client;
3133
private final ActivityInfo info;
3234
private final Scope metricsScope;
3335

34-
LocalActivityExecutionContextImpl(ActivityInfo info, Scope metricsScope) {
36+
LocalActivityExecutionContextImpl(WorkflowClient client, ActivityInfo info, Scope metricsScope) {
37+
this.client = client;
3538
this.info = info;
3639
this.metricsScope = metricsScope;
3740
}
@@ -92,4 +95,9 @@ public Scope getMetricsScope() {
9295
public Object getLastHeartbeatValue() {
9396
return null;
9497
}
98+
99+
@Override
100+
public WorkflowClient getWorkflowClient() {
101+
return client;
102+
}
95103
}

temporal-sdk/src/main/java/io/temporal/internal/worker/SyncActivityWorker.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020

2121
package io.temporal.internal.worker;
2222

23+
import io.temporal.client.WorkflowClient;
2324
import io.temporal.internal.activity.ActivityExecutionContextFactory;
2425
import io.temporal.internal.activity.ActivityExecutionContextFactoryImpl;
2526
import io.temporal.internal.activity.ActivityTaskHandlerImpl;
26-
import io.temporal.serviceclient.WorkflowServiceStubs;
2727
import io.temporal.worker.tuning.ActivitySlotInfo;
2828
import io.temporal.worker.tuning.SlotSupplier;
2929
import java.time.Duration;
@@ -47,7 +47,7 @@ public class SyncActivityWorker implements SuspendableWorker {
4747
private final ActivityWorker worker;
4848

4949
public SyncActivityWorker(
50-
WorkflowServiceStubs service,
50+
WorkflowClient client,
5151
String namespace,
5252
String taskQueue,
5353
double taskQueueActivitiesPerSecond,
@@ -69,7 +69,7 @@ public SyncActivityWorker(
6969
null));
7070
ActivityExecutionContextFactory activityExecutionContextFactory =
7171
new ActivityExecutionContextFactoryImpl(
72-
service,
72+
client,
7373
identity,
7474
namespace,
7575
options.getMaxHeartbeatThrottleInterval(),
@@ -86,7 +86,7 @@ public SyncActivityWorker(
8686
options.getContextPropagators());
8787
this.worker =
8888
new ActivityWorker(
89-
service,
89+
client.getWorkflowServiceStubs(),
9090
namespace,
9191
taskQueue,
9292
taskQueueActivitiesPerSecond,

temporal-sdk/src/main/java/io/temporal/internal/worker/SyncWorkflowWorker.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@
2424

2525
import io.temporal.api.common.v1.Payloads;
2626
import io.temporal.api.taskqueue.v1.TaskQueue;
27+
import io.temporal.client.WorkflowClient;
2728
import io.temporal.common.converter.DataConverter;
2829
import io.temporal.internal.activity.ActivityExecutionContextFactory;
2930
import io.temporal.internal.activity.ActivityTaskHandlerImpl;
3031
import io.temporal.internal.activity.LocalActivityExecutionContextFactoryImpl;
3132
import io.temporal.internal.replay.ReplayWorkflowTaskHandler;
3233
import io.temporal.internal.sync.POJOWorkflowImplementationFactory;
3334
import io.temporal.internal.sync.WorkflowThreadExecutor;
34-
import io.temporal.serviceclient.WorkflowServiceStubs;
3535
import io.temporal.worker.WorkflowImplementationOptions;
3636
import io.temporal.worker.WorkflowTaskDispatchHandle;
3737
import io.temporal.worker.tuning.LocalActivitySlotInfo;
@@ -75,7 +75,7 @@ public class SyncWorkflowWorker implements SuspendableWorker {
7575
private boolean runningLocalActivityWorker;
7676

7777
public SyncWorkflowWorker(
78-
@Nonnull WorkflowServiceStubs service,
78+
@Nonnull WorkflowClient client,
7979
@Nonnull String namespace,
8080
@Nonnull String taskQueue,
8181
@Nonnull SingleWorkerOptions singleWorkerOptions,
@@ -101,7 +101,7 @@ public SyncWorkflowWorker(
101101
namespace);
102102

103103
ActivityExecutionContextFactory laActivityExecutionContextFactory =
104-
new LocalActivityExecutionContextFactoryImpl();
104+
new LocalActivityExecutionContextFactoryImpl(client);
105105
laTaskHandler =
106106
new ActivityTaskHandlerImpl(
107107
namespace,
@@ -126,12 +126,12 @@ public SyncWorkflowWorker(
126126
singleWorkerOptions,
127127
stickyTaskQueue,
128128
singleWorkerOptions.getStickyQueueScheduleToStartTimeout(),
129-
service,
129+
client.getWorkflowServiceStubs(),
130130
laWorker.getLocalActivityScheduler());
131131

132132
workflowWorker =
133133
new WorkflowWorker(
134-
service,
134+
client.getWorkflowServiceStubs(),
135135
namespace,
136136
taskQueue,
137137
stickyTaskQueueName,
@@ -152,7 +152,7 @@ public SyncWorkflowWorker(
152152
singleWorkerOptions,
153153
null,
154154
Duration.ZERO,
155-
service,
155+
client.getWorkflowServiceStubs(),
156156
laWorker.getLocalActivityScheduler());
157157

158158
queryReplayHelper = new QueryReplayHelper(nonStickyReplayTaskHandler);

temporal-sdk/src/main/java/io/temporal/worker/Worker.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import io.temporal.internal.sync.WorkflowThreadExecutor;
3737
import io.temporal.internal.worker.*;
3838
import io.temporal.serviceclient.MetricsTag;
39-
import io.temporal.serviceclient.WorkflowServiceStubs;
4039
import io.temporal.worker.tuning.*;
4140
import io.temporal.workflow.Functions.Func;
4241
import io.temporal.workflow.WorkflowMethod;
@@ -94,7 +93,6 @@ public final class Worker {
9493
this.taskQueue = taskQueue;
9594
this.options = WorkerOptions.newBuilder(options).validateAndBuildWithDefaults();
9695
factoryOptions = WorkerFactoryOptions.newBuilder(factoryOptions).validateAndBuildWithDefaults();
97-
WorkflowServiceStubs service = client.getWorkflowServiceStubs();
9896
WorkflowClientOptions clientOptions = client.getOptions();
9997
String namespace = clientOptions.getNamespace();
10098
Map<String, String> tags =
@@ -114,7 +112,7 @@ public final class Worker {
114112

115113
activityWorker =
116114
new SyncActivityWorker(
117-
service,
115+
client,
118116
namespace,
119117
taskQueue,
120118
this.options.getMaxTaskQueueActivitiesPerSecond(),
@@ -161,9 +159,10 @@ public final class Worker {
161159
? new FixedSizeSlotSupplier<>(this.options.getMaxConcurrentLocalActivityExecutionSize())
162160
: this.options.getWorkerTuner().getLocalActivitySlotSupplier();
163161
attachMetricsToResourceController(taggedScope, localActivitySlotSupplier);
162+
164163
workflowWorker =
165164
new SyncWorkflowWorker(
166-
service,
165+
client,
167166
namespace,
168167
taskQueue,
169168
singleWorkerOptions,

0 commit comments

Comments
 (0)