接收任务是一个等待一个确定消息的简单任务。当流程执行到接收任务时,流程状态会被持久化到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());

世间山河广,祝你得偿所愿!