Receive Task 接收消息任务
一个接收任务是一个简单的任务,它等待某个消息的到来。当流程的执行到达一个接收任务时,流程的状态被提交到持久性存储中。这意味着流程将一直处于这种等待状态,直到引擎收到一个特定的消息,从而触发流程在接收任务之外的继续执行。
一个有消息参考的接收任务可以像普通事件一样被触发。
<definitions ...>
<message id="newInvoice" name="newInvoiceMessage"/>
<process ...>
<receiveTask id="waitState" name="wait" messageRef="newInvoice">
...
然后你可以将它和消息关联起来。
// 关联消息
runtimeService.createMessageCorrelation(subscription.getEventName())
.processInstanceBusinessKey("AB-123")
.correlate();
或者明确地查询订阅并触发它:
ProcessInstance pi = runtimeService.startProcessInstanceByKey("processWaitingInReceiveTask");
EventSubscription subscription = runtimeService.createEventSubscriptionQuery()
.processInstanceId(pi.getId()).eventType("message").singleResult();
runtimeService.messageEventReceived(subscription.getEventName(), subscription.getExecutionId());
并行多实例的相关性是不可能的,因为订阅不能被明确地识别。
要继续一个当前在接收任务中等待的流程实例,而没有消息参考,可以调用runtimeService.signal(executionId)
,使用接收任务中的执行的id。
<receiveTask id="waitState" name="wait" />
以下代码段显示在实践中如何运作:
ProcessInstance pi = runtimeService.startProcessInstanceByKey("receiveTask");
Execution execution = runtimeService.createExecutionQuery()
.processInstanceId(pi.getId()).activityId("waitState").singleResult();
runtimeService.signal(execution.getId());
Camunda 扩展
属性 | camunda:asyncBefore, camunda:asyncAfter, camunda:exclusive, camunda:jobPriority |
---|---|
扩展元素 | camunda:failedJobRetryTimeCycle, camunda:inputOutput |
约束 |
The camunda:exclusive attribute is only evaluated if the attribute
camunda:asyncBefore or camunda:asyncAfter is set to true
|