26
26
import com .uber .cadence .internal .replay .ReplayDecisionTaskHandler ;
27
27
import com .uber .cadence .internal .worker .DecisionTaskHandler ;
28
28
import com .uber .cadence .internal .worker .LocalActivityWorker ;
29
+ import com .uber .cadence .internal .worker .LocallyDispatchedActivityWorker ;
29
30
import com .uber .cadence .internal .worker .SingleWorkerOptions ;
30
31
import com .uber .cadence .internal .worker .SuspendableWorker ;
31
32
import com .uber .cadence .internal .worker .WorkflowWorker ;
@@ -49,10 +50,14 @@ public class SyncWorkflowWorker
49
50
50
51
private final WorkflowWorker workflowWorker ;
51
52
private final LocalActivityWorker laWorker ;
53
+ private final LocallyDispatchedActivityWorker ldaWorker ;
54
+
52
55
private final POJOWorkflowImplementationFactory factory ;
53
56
private final DataConverter dataConverter ;
54
57
private final POJOActivityTaskHandler laTaskHandler ;
58
+ private final POJOActivityTaskHandler ldaTaskHandler ;
55
59
private final ScheduledExecutorService heartbeatExecutor = Executors .newScheduledThreadPool (4 );
60
+ private final ScheduledExecutorService ldaHeartbeatExecutor = Executors .newScheduledThreadPool (4 );
56
61
57
62
public SyncWorkflowWorker (
58
63
IWorkflowService service ,
@@ -61,6 +66,7 @@ public SyncWorkflowWorker(
61
66
Function <WorkflowInterceptor , WorkflowInterceptor > interceptorFactory ,
62
67
SingleWorkerOptions workflowOptions ,
63
68
SingleWorkerOptions localActivityOptions ,
69
+ SingleWorkerOptions locallyDispatchedActivityOptions ,
64
70
DeciderCache cache ,
65
71
String stickyTaskListName ,
66
72
Duration stickyDecisionScheduleToStartTimeout ,
@@ -91,10 +97,25 @@ public SyncWorkflowWorker(
91
97
stickyDecisionScheduleToStartTimeout ,
92
98
service ,
93
99
laWorker .getLocalActivityTaskPoller ());
100
+ ldaTaskHandler =
101
+ new POJOActivityTaskHandler (
102
+ service ,
103
+ domain ,
104
+ locallyDispatchedActivityOptions .getDataConverter (),
105
+ ldaHeartbeatExecutor );
106
+ ldaWorker =
107
+ new LocallyDispatchedActivityWorker (
108
+ service , domain , taskList , locallyDispatchedActivityOptions , ldaTaskHandler );
94
109
95
110
workflowWorker =
96
111
new WorkflowWorker (
97
- service , domain , taskList , workflowOptions , taskHandler , stickyTaskListName );
112
+ service ,
113
+ domain ,
114
+ taskList ,
115
+ workflowOptions ,
116
+ taskHandler ,
117
+ ldaWorker .getLocallyDispatchedActivityTaskPoller (),
118
+ stickyTaskListName );
98
119
}
99
120
100
121
public void setWorkflowImplementationTypes (
@@ -115,64 +136,80 @@ public void setLocalActivitiesImplementation(Object... activitiesImplementation)
115
136
this .laTaskHandler .setLocalActivitiesImplementation (activitiesImplementation );
116
137
}
117
138
139
+ public void setActivitiesImplementationToDispatchLocally (Object ... activitiesImplementation ) {
140
+ this .ldaTaskHandler .setActivitiesImplementation (activitiesImplementation );
141
+ }
142
+
118
143
@ Override
119
144
public void start () {
120
145
workflowWorker .start ();
121
146
// workflowWorker doesn't start if no types are registered with it. In that case we don't need
122
147
// to start LocalActivity Worker.
123
148
if (workflowWorker .isStarted ()) {
124
149
laWorker .start ();
150
+ ldaWorker .start ();
125
151
}
126
152
}
127
153
128
154
@ Override
129
155
public boolean isStarted () {
130
- return workflowWorker .isStarted () && laWorker .isStarted ();
156
+ return workflowWorker .isStarted () && laWorker .isStarted () && ldaWorker . isStarted () ;
131
157
}
132
158
133
159
@ Override
134
160
public boolean isShutdown () {
135
- return workflowWorker .isShutdown () && laWorker .isShutdown ();
161
+ return workflowWorker .isShutdown () && laWorker .isShutdown () && ldaWorker . isShutdown () ;
136
162
}
137
163
138
164
@ Override
139
165
public boolean isTerminated () {
140
- return workflowWorker .isTerminated () && laWorker .isTerminated ();
166
+ return workflowWorker .isTerminated ()
167
+ && laWorker .isTerminated ()
168
+ && ldaHeartbeatExecutor .isTerminated ()
169
+ && ldaWorker .isTerminated ();
141
170
}
142
171
143
172
@ Override
144
173
public void shutdown () {
145
174
laWorker .shutdown ();
175
+ ldaHeartbeatExecutor .shutdown ();
176
+ ldaWorker .shutdown ();
146
177
workflowWorker .shutdown ();
147
178
}
148
179
149
180
@ Override
150
181
public void shutdownNow () {
151
182
laWorker .shutdownNow ();
183
+ ldaHeartbeatExecutor .shutdownNow ();
184
+ ldaWorker .shutdownNow ();
152
185
workflowWorker .shutdownNow ();
153
186
}
154
187
155
188
@ Override
156
189
public void awaitTermination (long timeout , TimeUnit unit ) {
157
190
long timeoutMillis = InternalUtils .awaitTermination (laWorker , unit .toMillis (timeout ));
191
+ timeoutMillis = InternalUtils .awaitTermination (ldaHeartbeatExecutor , timeoutMillis );
192
+ timeoutMillis = InternalUtils .awaitTermination (ldaWorker , timeoutMillis );
158
193
InternalUtils .awaitTermination (workflowWorker , timeoutMillis );
159
194
}
160
195
161
196
@ Override
162
197
public void suspendPolling () {
163
198
workflowWorker .suspendPolling ();
164
199
laWorker .suspendPolling ();
200
+ ldaWorker .suspendPolling ();
165
201
}
166
202
167
203
@ Override
168
204
public void resumePolling () {
169
205
workflowWorker .resumePolling ();
170
206
laWorker .resumePolling ();
207
+ ldaWorker .resumePolling ();
171
208
}
172
209
173
210
@ Override
174
211
public boolean isSuspended () {
175
- return workflowWorker .isSuspended () && laWorker .isSuspended ();
212
+ return workflowWorker .isSuspended () && laWorker .isSuspended () && ldaWorker . isSuspended () ;
176
213
}
177
214
178
215
public <R > R queryWorkflowExecution (
0 commit comments