Skip to content

Commit f2a06c6

Browse files
committed
[Fix #744] Suspend/resume status and associated event
Workflow suspend and resume event should be sent regardless a task was in fact suspended or not. Same applies to workflow status. Signed-off-by: Francisco Javier Tirado Sarti <[email protected]>
1 parent eb5718f commit f2a06c6

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowMutableInstance.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ public boolean suspend() {
176176
statusLock.lock();
177177
if (TaskExecutorHelper.isActive(status.get())) {
178178
suspended = new CompletableFuture<TaskContext>();
179+
workflowContext.instance().status(WorkflowStatus.SUSPENDED);
180+
publishEvent(
181+
workflowContext,
182+
l -> l.onWorkflowSuspended(new WorkflowSuspendedEvent(workflowContext)));
179183
return true;
180184
} else {
181185
return false;
@@ -197,11 +201,11 @@ public boolean resume() {
197201
publishEvent(
198202
workflowContext,
199203
l -> l.onTaskResumed(new TaskResumedEvent(workflowContext, suspendedTask)));
200-
publishEvent(
201-
workflowContext, l -> l.onWorkflowResumed(new WorkflowResumedEvent(workflowContext)));
202204
} else {
203205
suspended = null;
204206
}
207+
publishEvent(
208+
workflowContext, l -> l.onWorkflowResumed(new WorkflowResumedEvent(workflowContext)));
205209
return true;
206210
} else {
207211
return false;
@@ -216,12 +220,8 @@ public CompletableFuture<TaskContext> completedChecks(TaskContext t) {
216220
statusLock.lock();
217221
if (suspended != null) {
218222
suspendedTask = t;
219-
workflowContext.instance().status(WorkflowStatus.SUSPENDED);
220223
publishEvent(
221224
workflowContext, l -> l.onTaskSuspended(new TaskSuspendedEvent(workflowContext, t)));
222-
publishEvent(
223-
workflowContext,
224-
l -> l.onWorkflowSuspended(new WorkflowSuspendedEvent(workflowContext)));
225225
return suspended;
226226
}
227227
if (cancelled != null) {

impl/test/src/test/java/io/serverlessworkflow/impl/test/LifeCycleEventsTest.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,18 @@ void testSuspendResumeNotWait()
115115
.instance(Map.of());
116116
CompletableFuture<WorkflowModel> future = instance.start();
117117
instance.suspend();
118+
assertThat(instance.status()).isEqualTo(WorkflowStatus.SUSPENDED);
118119
instance.resume();
119120
assertThat(future.get(1, TimeUnit.SECONDS).asMap().orElseThrow())
120121
.isEqualTo(Map.of("name", "Javierito"));
122+
assertThat(instance.status()).isEqualTo(WorkflowStatus.COMPLETED);
123+
WorkflowSuspendedCEData workflowSuspendedEvent =
124+
assertPojoInCE(
125+
"io.serverlessworkflow.workflow.suspended.v1", WorkflowSuspendedCEData.class);
126+
WorkflowResumedCEData workflowResumedEvent =
127+
assertPojoInCE("io.serverlessworkflow.workflow.resumed.v1", WorkflowResumedCEData.class);
128+
assertThat(workflowSuspendedEvent.suspendedAt())
129+
.isBeforeOrEqualTo(workflowResumedEvent.resumedAt());
121130
}
122131

123132
@Test
@@ -127,10 +136,10 @@ void testSuspendResumeWait()
127136
appl.workflowDefinition(WorkflowReader.readWorkflowFromClasspath("wait-set.yaml"))
128137
.instance(Map.of());
129138
CompletableFuture<WorkflowModel> future = instance.start();
130-
instance.suspend();
131139
assertThat(instance.status()).isEqualTo(WorkflowStatus.WAITING);
132-
Thread.sleep(550);
140+
instance.suspend();
133141
assertThat(instance.status()).isEqualTo(WorkflowStatus.SUSPENDED);
142+
Thread.sleep(550);
134143
instance.resume();
135144
assertThat(future.get(1, TimeUnit.SECONDS).asMap().orElseThrow())
136145
.isEqualTo(Map.of("name", "Javierito"));

0 commit comments

Comments
 (0)