30
30
import com .google .common .base .Strings ;
31
31
import com .google .protobuf .Any ;
32
32
import io .temporal .api .command .v1 .*;
33
- import io .temporal .api .common .v1 .Payloads ;
34
- import io .temporal .api .common .v1 .SearchAttributes ;
35
- import io .temporal .api .common .v1 .WorkflowExecution ;
33
+ import io .temporal .api .common .v1 .*;
36
34
import io .temporal .api .enums .v1 .EventType ;
37
35
import io .temporal .api .failure .v1 .Failure ;
38
36
import io .temporal .api .history .v1 .*;
@@ -60,7 +58,8 @@ enum HandleEventStatus {
60
58
61
59
/** Initial set of SDK flags that will be set on all new workflow executions. */
62
60
private static final List <SdkFlag > initialFlags =
63
- Collections .unmodifiableList (Arrays .asList (SdkFlag .SKIP_YIELD_ON_DEFAULT_VERSION ));
61
+ Collections .unmodifiableList (
62
+ Collections .singletonList (SdkFlag .SKIP_YIELD_ON_DEFAULT_VERSION ));
64
63
65
64
/**
66
65
* EventId of the WorkflowTaskStarted event of the Workflow Task that was picked up by a worker
@@ -159,7 +158,7 @@ enum HandleEventStatus {
159
158
160
159
private final WFTBuffer wftBuffer = new WFTBuffer ();
161
160
162
- private List <Message > messages = new ArrayList <Message >();
161
+ private List <Message > messages = new ArrayList <>();
163
162
164
163
private final SdkFlags flags ;
165
164
@@ -358,8 +357,8 @@ private void handleSingleEventLookahead(HistoryEvent event) {
358
357
}
359
358
360
359
private List <Message > takeLTE (long eventId ) {
361
- List <Message > m = new ArrayList <Message >();
362
- List <Message > remainingMessages = new ArrayList <Message >();
360
+ List <Message > m = new ArrayList <>();
361
+ List <Message > remainingMessages = new ArrayList <>();
363
362
for (Message msg : this .messages ) {
364
363
if (msg .getEventId () > eventId ) {
365
364
remainingMessages .add (msg );
@@ -430,12 +429,16 @@ private void handleSingleEvent(HistoryEvent event, boolean hasNextEvent) {
430
429
replaying = false ;
431
430
}
432
431
433
- Long initialCommandEventId = getInitialCommandEventId (event );
434
- EntityStateMachine c = stateMachines .get (initialCommandEventId );
432
+ final OptionalLong initialCommandEventId = getInitialCommandEventId (event );
433
+ if (!initialCommandEventId .isPresent ()) {
434
+ return ;
435
+ }
436
+
437
+ EntityStateMachine c = stateMachines .get (initialCommandEventId .getAsLong ());
435
438
if (c != null ) {
436
439
c .handleEvent (event , hasNextEvent );
437
440
if (c .isFinalState ()) {
438
- stateMachines .remove (initialCommandEventId );
441
+ stateMachines .remove (initialCommandEventId . getAsLong () );
439
442
}
440
443
} else {
441
444
handleNonStatefulEvent (event , hasNextEvent );
@@ -585,9 +588,7 @@ public void sendMessage(Message message) {
585
588
586
589
public List <Message > takeMessages () {
587
590
List <Message > result = new ArrayList <>(messageOutbox .size ());
588
- for (Message message : messageOutbox ) {
589
- result .add (message );
590
- }
591
+ result .addAll (messageOutbox );
591
592
messageOutbox .clear ();
592
593
return result ;
593
594
}
@@ -960,10 +961,9 @@ public boolean getVersion(
960
961
VersionStateMachine stateMachine =
961
962
versions .computeIfAbsent (
962
963
changeId ,
963
- (idKey ) -> {
964
- return VersionStateMachine .newInstance (
965
- changeId , this ::isReplaying , commandSink , stateMachineSink );
966
- });
964
+ (idKey ) ->
965
+ VersionStateMachine .newInstance (
966
+ changeId , this ::isReplaying , commandSink , stateMachineSink ));
967
967
return stateMachine .getVersion (
968
968
minSupported ,
969
969
maxSupported ,
@@ -1194,60 +1194,85 @@ public void updateRunId(String currentRunId) {
1194
1194
}
1195
1195
}
1196
1196
1197
- private long getInitialCommandEventId (HistoryEvent event ) {
1197
+ /**
1198
+ * Extracts the eventId of the "initial command" for the given event.
1199
+ *
1200
+ * <p>The "initial command" is the event which started a group of related events:
1201
+ * ActivityTaskScheduled, TimerStarted, and so on; for events which are not part of a group, the
1202
+ * event's own eventId is returned. If the event has an unknown type but is marked as ignorable,
1203
+ * then {@link OptionalLong#empty()} is returned instead.
1204
+ *
1205
+ * @return the eventId of the initial command, or {@link OptionalLong#empty()}
1206
+ */
1207
+ private OptionalLong getInitialCommandEventId (HistoryEvent event ) {
1198
1208
switch (event .getEventType ()) {
1199
1209
case EVENT_TYPE_ACTIVITY_TASK_STARTED :
1200
- return event .getActivityTaskStartedEventAttributes ().getScheduledEventId ();
1210
+ return OptionalLong . of ( event .getActivityTaskStartedEventAttributes ().getScheduledEventId () );
1201
1211
case EVENT_TYPE_ACTIVITY_TASK_COMPLETED :
1202
- return event .getActivityTaskCompletedEventAttributes ().getScheduledEventId ();
1212
+ return OptionalLong .of (
1213
+ event .getActivityTaskCompletedEventAttributes ().getScheduledEventId ());
1203
1214
case EVENT_TYPE_ACTIVITY_TASK_FAILED :
1204
- return event .getActivityTaskFailedEventAttributes ().getScheduledEventId ();
1215
+ return OptionalLong . of ( event .getActivityTaskFailedEventAttributes ().getScheduledEventId () );
1205
1216
case EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT :
1206
- return event .getActivityTaskTimedOutEventAttributes ().getScheduledEventId ();
1217
+ return OptionalLong .of (
1218
+ event .getActivityTaskTimedOutEventAttributes ().getScheduledEventId ());
1207
1219
case EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED :
1208
- return event .getActivityTaskCancelRequestedEventAttributes ().getScheduledEventId ();
1220
+ return OptionalLong .of (
1221
+ event .getActivityTaskCancelRequestedEventAttributes ().getScheduledEventId ());
1209
1222
case EVENT_TYPE_ACTIVITY_TASK_CANCELED :
1210
- return event .getActivityTaskCanceledEventAttributes ().getScheduledEventId ();
1223
+ return OptionalLong .of (
1224
+ event .getActivityTaskCanceledEventAttributes ().getScheduledEventId ());
1211
1225
case EVENT_TYPE_TIMER_FIRED :
1212
- return event .getTimerFiredEventAttributes ().getStartedEventId ();
1226
+ return OptionalLong . of ( event .getTimerFiredEventAttributes ().getStartedEventId () );
1213
1227
case EVENT_TYPE_TIMER_CANCELED :
1214
- return event .getTimerCanceledEventAttributes ().getStartedEventId ();
1228
+ return OptionalLong . of ( event .getTimerCanceledEventAttributes ().getStartedEventId () );
1215
1229
case EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED :
1216
- return event
1217
- .getRequestCancelExternalWorkflowExecutionFailedEventAttributes ()
1218
- .getInitiatedEventId ();
1230
+ return OptionalLong .of (
1231
+ event
1232
+ .getRequestCancelExternalWorkflowExecutionFailedEventAttributes ()
1233
+ .getInitiatedEventId ());
1219
1234
case EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_CANCEL_REQUESTED :
1220
- return event
1221
- .getExternalWorkflowExecutionCancelRequestedEventAttributes ()
1222
- .getInitiatedEventId ();
1235
+ return OptionalLong .of (
1236
+ event
1237
+ .getExternalWorkflowExecutionCancelRequestedEventAttributes ()
1238
+ .getInitiatedEventId ());
1223
1239
case EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_FAILED :
1224
- return event .getStartChildWorkflowExecutionFailedEventAttributes ().getInitiatedEventId ();
1240
+ return OptionalLong .of (
1241
+ event .getStartChildWorkflowExecutionFailedEventAttributes ().getInitiatedEventId ());
1225
1242
case EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED :
1226
- return event .getChildWorkflowExecutionStartedEventAttributes ().getInitiatedEventId ();
1243
+ return OptionalLong .of (
1244
+ event .getChildWorkflowExecutionStartedEventAttributes ().getInitiatedEventId ());
1227
1245
case EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_COMPLETED :
1228
- return event .getChildWorkflowExecutionCompletedEventAttributes ().getInitiatedEventId ();
1246
+ return OptionalLong .of (
1247
+ event .getChildWorkflowExecutionCompletedEventAttributes ().getInitiatedEventId ());
1229
1248
case EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_FAILED :
1230
- return event .getChildWorkflowExecutionFailedEventAttributes ().getInitiatedEventId ();
1249
+ return OptionalLong .of (
1250
+ event .getChildWorkflowExecutionFailedEventAttributes ().getInitiatedEventId ());
1231
1251
case EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_CANCELED :
1232
- return event .getChildWorkflowExecutionCanceledEventAttributes ().getInitiatedEventId ();
1252
+ return OptionalLong .of (
1253
+ event .getChildWorkflowExecutionCanceledEventAttributes ().getInitiatedEventId ());
1233
1254
case EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TIMED_OUT :
1234
- return event .getChildWorkflowExecutionTimedOutEventAttributes ().getInitiatedEventId ();
1255
+ return OptionalLong .of (
1256
+ event .getChildWorkflowExecutionTimedOutEventAttributes ().getInitiatedEventId ());
1235
1257
case EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TERMINATED :
1236
- return event .getChildWorkflowExecutionTerminatedEventAttributes ().getInitiatedEventId ();
1258
+ return OptionalLong .of (
1259
+ event .getChildWorkflowExecutionTerminatedEventAttributes ().getInitiatedEventId ());
1237
1260
case EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED :
1238
- return event
1239
- .getSignalExternalWorkflowExecutionFailedEventAttributes ()
1240
- .getInitiatedEventId ();
1261
+ return OptionalLong .of (
1262
+ event .getSignalExternalWorkflowExecutionFailedEventAttributes ().getInitiatedEventId ());
1241
1263
case EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_SIGNALED :
1242
- return event .getExternalWorkflowExecutionSignaledEventAttributes ().getInitiatedEventId ();
1264
+ return OptionalLong .of (
1265
+ event .getExternalWorkflowExecutionSignaledEventAttributes ().getInitiatedEventId ());
1243
1266
case EVENT_TYPE_WORKFLOW_TASK_STARTED :
1244
- return event .getWorkflowTaskStartedEventAttributes ().getScheduledEventId ();
1267
+ return OptionalLong . of ( event .getWorkflowTaskStartedEventAttributes ().getScheduledEventId () );
1245
1268
case EVENT_TYPE_WORKFLOW_TASK_COMPLETED :
1246
- return event .getWorkflowTaskCompletedEventAttributes ().getScheduledEventId ();
1269
+ return OptionalLong .of (
1270
+ event .getWorkflowTaskCompletedEventAttributes ().getScheduledEventId ());
1247
1271
case EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT :
1248
- return event .getWorkflowTaskTimedOutEventAttributes ().getScheduledEventId ();
1272
+ return OptionalLong .of (
1273
+ event .getWorkflowTaskTimedOutEventAttributes ().getScheduledEventId ());
1249
1274
case EVENT_TYPE_WORKFLOW_TASK_FAILED :
1250
- return event .getWorkflowTaskFailedEventAttributes ().getScheduledEventId ();
1275
+ return OptionalLong . of ( event .getWorkflowTaskFailedEventAttributes ().getScheduledEventId () );
1251
1276
1252
1277
case EVENT_TYPE_ACTIVITY_TASK_SCHEDULED :
1253
1278
case EVENT_TYPE_TIMER_STARTED :
@@ -1266,12 +1291,14 @@ private long getInitialCommandEventId(HistoryEvent event) {
1266
1291
case EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT :
1267
1292
case EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED :
1268
1293
case EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED :
1269
- return event .getEventId ();
1270
- case UNRECOGNIZED :
1271
- case EVENT_TYPE_UNSPECIFIED :
1294
+ return OptionalLong .of (event .getEventId ());
1295
+
1296
+ default :
1297
+ if (event .getWorkerMayIgnore ()) {
1298
+ return OptionalLong .empty ();
1299
+ }
1272
1300
throw new IllegalArgumentException ("Unexpected event type: " + event .getEventType ());
1273
1301
}
1274
- throw new IllegalStateException ("unreachable" );
1275
1302
}
1276
1303
1277
1304
/**
0 commit comments