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

额外资料

目录: