Skip to content

Commit e0c5377

Browse files
authored
Remove async-send-event attribute from commandContext while sending event (#4123)
* Remove async-send-event attribute from commandContext when sending event * Only re-add async-send-event attribute if it was there in the first place
1 parent 1d4a975 commit e0c5377

4 files changed

Lines changed: 114 additions & 0 deletions

File tree

modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/behavior/SendEventTaskActivityBehavior.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ public void execute(DelegateExecution execution) {
9898
jobService.scheduleAsyncJob(job);
9999

100100
} else {
101+
commandContext.removeAttribute(AsyncSendEventJobHandler.TYPE);
102+
101103
Collection<EventPayloadInstance> eventPayloadInstances = EventInstanceBpmnUtil.createEventPayloadInstances(executionEntity,
102104
processEngineConfiguration.getExpressionManager(), execution.getCurrentFlowElement(), eventModel);
103105

@@ -112,6 +114,9 @@ public void execute(DelegateExecution execution) {
112114
eventRegistry.sendSystemEventOutbound(eventInstance);
113115
}
114116

117+
if (executedAsAsyncJob) {
118+
commandContext.addAttribute(AsyncSendEventJobHandler.TYPE, true);
119+
}
115120
}
116121

117122
if (sendEventServiceTask.isTriggerable() && !executedAsAsyncJob) {

modules/flowable-engine/src/test/java/org/flowable/engine/test/eventregistry/SendEventTaskTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,42 @@ public void testSequentialMultiInstanceSendEvent() {
188188
}
189189
}
190190

191+
@Test
192+
@Deployment(resources = { "org/flowable/engine/test/eventregistry/SendEventTaskTest.testReceiveAndSendEvent.bpmn20.xml",
193+
"org/flowable/engine/test/eventregistry/SendEventTaskTest.testSendEventOnSystemChannel.bpmn20.xml" })
194+
public void testSendAsyncAndReceiveOnSystemChannelAndSendAsyncAgain() throws Exception {
195+
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process");
196+
ProcessInstance processInstance2 = runtimeService.startProcessInstanceByKey("sendAndReceiveProcess");
197+
198+
assertThat(outboundEventChannelAdapter.receivedEvents).isEmpty();
199+
200+
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
201+
assertThat(task).isNotNull();
202+
203+
taskService.complete(task.getId());
204+
205+
Job job = managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult();
206+
assertThat(job).isNotNull();
207+
assertThat(job.getJobHandlerType()).isEqualTo(AsyncSendEventJobHandler.TYPE);
208+
assertThat(job.getElementId()).isEqualTo("sendEventTask");
209+
210+
assertThat(outboundEventChannelAdapter.receivedEvents).isEmpty();
211+
212+
managementService.executeJob(job.getId());
213+
214+
assertThat(outboundEventChannelAdapter.receivedEvents).hasSize(1);
215+
216+
// Second send event task should also be handled async
217+
job = managementService.createJobQuery().processInstanceId(processInstance2.getId()).singleResult();
218+
assertThat(job).isNotNull();
219+
assertThat(job.getJobHandlerType()).isEqualTo(AsyncSendEventJobHandler.TYPE);
220+
assertThat(job.getElementId()).isEqualTo("sendEventTask2");
221+
222+
JobTestHelper.waitForJobExecutorToProcessAllJobs(processEngineConfiguration, managementService, 5000, 200);
223+
224+
assertThat(outboundEventChannelAdapter.receivedEvents).hasSize(2);
225+
}
226+
191227
@Test
192228
@Deployment
193229
public void testSendEventSynchronously() throws Exception {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<definitions id="definitions"
3+
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
4+
xmlns:flowable="http://flowable.org/bpmn"
5+
targetNamespace="Examples"
6+
xmlns:tns="Examples">
7+
8+
<process id="sendAndReceiveProcess">
9+
10+
<startEvent id="theStart" />
11+
12+
<sequenceFlow sourceRef="theStart" targetRef="ReceiveEventTask_1" />
13+
14+
<receiveTask id="ReceiveEventTask_1" name="Receive event task">
15+
<extensionElements>
16+
<flowable:eventType><![CDATA[myEvent]]></flowable:eventType>
17+
</extensionElements>
18+
</receiveTask>
19+
20+
<sequenceFlow sourceRef="ReceiveEventTask_1" targetRef="sendEventTask2" />
21+
22+
<serviceTask id="sendEventTask2" flowable:type="send-event">
23+
<extensionElements>
24+
<flowable:eventType>myEvent</flowable:eventType>
25+
<flowable:channelKey>out-channel</flowable:channelKey>
26+
<flowable:eventInParameter source="test" target="eventProperty" />
27+
</extensionElements>
28+
</serviceTask>
29+
30+
<sequenceFlow sourceRef="sendEventTask2" targetRef="theEnd" />
31+
32+
<endEvent id="theEnd" />
33+
34+
</process>
35+
36+
</definitions>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<definitions id="definitions"
3+
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
4+
xmlns:flowable="http://flowable.org/bpmn"
5+
targetNamespace="Examples"
6+
xmlns:tns="Examples">
7+
8+
<process id="process">
9+
10+
<startEvent id="theStart" />
11+
12+
<sequenceFlow sourceRef="theStart" targetRef="task" />
13+
14+
<userTask id="task" />
15+
16+
<sequenceFlow sourceRef="task" targetRef="sendEventTask" />
17+
18+
<serviceTask id="sendEventTask" flowable:type="send-event">
19+
<extensionElements>
20+
<flowable:eventType>myEvent</flowable:eventType>
21+
<flowable:channelKey>out-channel</flowable:channelKey>
22+
<flowable:systemChannel></flowable:systemChannel>
23+
<flowable:eventInParameter source="test" target="eventProperty" />
24+
</extensionElements>
25+
</serviceTask>
26+
27+
<sequenceFlow sourceRef="sendEventTask" targetRef="taskAfter" />
28+
29+
<userTask id="taskAfter" />
30+
31+
<sequenceFlow sourceRef="taskAfter" targetRef="theEnd" />
32+
33+
<endEvent id="theEnd" />
34+
35+
</process>
36+
37+
</definitions>

0 commit comments

Comments
 (0)