定义
接收任务是一种简单任务,它会等待对应消息的到达。当流程执行到达接收任务时,流程状态会持
久化到数据库中,这意味着该流程将一直处于等待状态,直到引擎接收到一个特定的消息为止,该消息
将触发离开接收任务继续往下执行。
图形标记
接收任务显示为一个普通任务(圆角矩形),左上角是一个消息小图标,如图所示:
需要在注意的是,接收任务中的消息图标是白色的(黑色的消息图标表示已经发送的意思)。
XML标记
接收任务的 XML 表示格式如下:
<receiveTask id="receiveTask1" name="接受任务" />
使用示例
流程到达接收任务后,会进入一个等待状态,通常用于由外部完成的但需要耗费一定时间的工作,
当完成工作后,要使得流程继续往下执行,可以调用 runtimeService.trigger(executionId)方法,其中
executionId 是执行到此接收任务的执行实例的 id。下面我们看一接收务的使用示例,设计如图所示
流程,这是一个账号激活示例流程,当客户发起申请后,首先到达“管理员审核”用户任务节点,操作
完成后流转到“等待激活结果”接收任务节点,直到接收到对应消息后继续往下执行到流程结束。
流程对应的 XML 内容如下
<process id="receiveTaskProcess" name="任务-接收任务" isExecutable="true">
<startEvent id="a6f37f9b227774dd68879a4cae79865a8" />
<userTask id="a9a3ceaf2c4d64de2af1f861772ac516a" name="账号激活申请">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
</userTask>
<sequenceFlow id="a08c7bb0990b14e6ab2d878a8ec43a303" sourceRef="a6f37f9b227774dd68879a4cae79865a8" targetRef="a9a3ceaf2c4d64de2af1f861772ac516a" />
<receiveTask id="Activity_1uxmlgz" name="等待激活结果">
<extensionElements>
<flowable:executionListener class="com.dragon.test.bpmn.listener.ReceiveTaskExecutionListener" event="end" />
<flowable:assigneeType>static</flowable:assigneeType>
<flowable:formData />
</extensionElements>
</receiveTask>
<userTask id="Activity_1g60ycx" name="管理员审核">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
</userTask>
<endEvent id="Event_1vyjmzt" />
<sequenceFlow id="Flow_0be9ua9" sourceRef="a9a3ceaf2c4d64de2af1f861772ac516a" targetRef="Activity_1g60ycx" />
<sequenceFlow id="Flow_1xf4w9a" sourceRef="Activity_1g60ycx" targetRef="Activity_1uxmlgz" />
<sequenceFlow id="Flow_0v1w6nx" sourceRef="Activity_1uxmlgz" targetRef="Event_1vyjmzt" />
</process>
在以上流程定义中,接收任务 Activity_1uxmlgz 使用 flowable:executionListener 元素定义了一个执行监听器,
该元素并不属于 BPMN2.0 规范,而是 Flowable 扩展出来的元素。在这里设置的执行监听器会在节点结束
(event 属性为 end)时执行。关于执行监听器更详细的介绍和用法,详见第 17 章。这里例子中的执行监
听器 ReceiveTaskExecutionListener 内容如下:
@Slf4j
public class ReceiveTaskExecutionListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
FlowElement currentFlowElement = execution.getCurrentFlowElement();
log.info("当前为接收任务,节点名称:{},备注:{}", currentFlowElement.getName(), currentFlowElement.getDocumentation());
String result = (String)execution.getVariable("result");
log.info("接收任务已被触发,处理结果为:{}", result);
}
}
视频地址:
演示demo
本文中内容和案例出自贺波老师的书《深入Activiti流程引擎:核心原理与高阶实战》,书中的介绍更全面、详细,推荐给大家。
深入Activiti流程引擎