接收任务是一个等待一个确定消息的简单任务。当流程执行到接收任务时,流程状态会被持久化到storage。这意味着流程会一直等待直到一个特定的消息被引擎接收到,这个会触发流程离开接收任务。
一、定义一个接收任务
接收事件就像带有消息的,能被触发的普通事件:
<definitions ...>
<message id="newInvoice" name="newInvoiceMessage"/>
<process ...>
<receiveTask id="waitState" name="wait" messageRef="newInvoice">
...
关联消息:
// correlate the message
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),用到达接收任务的executionId进行触发。
下面的代码片段展示的是在工作中怎么使用:
ProcessInstance pi = runtimeService.startProcessInstanceByKey("receiveTask");
Execution execution = runtimeService.createExecutionQuery()
.processInstanceId(pi.getId())
.activityId("waitState")
.singleResult();
runtimeService.signal(execution.getId());