Camunda流程引擎系列
五、节点
前言
流程引擎的关键,特别是基于BPMN的流程引擎,我们应该去了解它包含哪些元素。
BPMN基本元素包括了这些元素,如下:
- 泳道:池和道;
- 三种连接对象:序列流、消息流和关联;
- 一种活动:任务(Task),其中包括了子流程任务(Sub-ProcessTask);
- 两种事件:普通开始事件(NoneStart Event)和普通结束事件(None End Event);
- 两种网关:排他网关(Exclusive)和并发网关(Parallel);
- 一种人工制造物:附注。
我们在这次分享中的节点,会是一个比较综合的东西,因为我们看基本元素里面并没有元素叫这个名字。我们会在这里介绍到一些常用的节点,包括启动、结束以及一些task,虽然我们在前面的分享已经涉及到了一些。
一、开始节点
- 开始节点代表一个流程的开始;
- 一个流程文件中,开始节点只能有一个,不能有多个;
- 子流程与引用流程其开始节点也只能是一个;
- 启动流程实例的时候,从开始节点开始运转流程;
开始节点有几种类型,如图:
结束节点
- 结束节点代表一个流程的结束;
- 在一个流程文件中,结束节点可以有多个;
- 如果实例运转到结束节点,则表示当前执行实例结束了;
结束节点有几种类型,如图:
二、UserTask
用户任务属于等待节点,既表示系统走到这里会等待人来处理,不会自己往后走,那么对于用户任务,我们可以先想想这几个问题:
- 任务从何而来?
- 任务由谁处理?
- 任务如何处理?
- 办理过的任务如何查看?
TaskService
这是Camunda的任务服务类,我们在之前runtimeService的分享中,其实已经涉及到了,我们可以从TaskService中发现各种执行任务相关的API。
我们在这里再分享一下通过变量的方式来启动任务:
- 在配置流程时,配入变量,如assignee一栏,将其配置为 #{userId};
- 启动流程或任务时通过variables参数传入变量的键值对;
/**
* 可通过定义的变量传入来启动对应流程
* 如在流程中定义了变量,如果不在启动时传入,系统会报错
* 如流程定义中指定用户为 #{userId}, 那么在启动时我们需要通过vars传入userId,放入map中
*
* @param key
* @param vars
* @return
*/
public ProcessInstance startProcess(String key, Map<String, Object> vars) {
return runtimeService.startProcessInstanceByKey(key, vars);
}
监听器
监听器类似于切片,可以在执行实例或任务的特定节点触发特定事件。
任务监听器是任务节点所特有的,而执行监听器是所有节点都具有的。监听器有特定的事件,我们需要在配置中为该类型指定监听器对应的类。
- 在配置中配置监听器
- 在代码中编写监听器
/**
* @author zerozhao
* @version 1.0
* @title: PnxTaskListenerImpl
* @projectName phoenix-camunda
* @description: TODO 我们可以通过监听器,在这里获取下一个任务的指派人,并将其设置进去。
* @date 2020/11/1623:08
*/
public class PnxTaskListenerImpl implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
String eventName = delegateTask.getEventName();
int priority = delegateTask.getPriority();
if ("create".equals(eventName)) {
delegateTask.setAssignee("user");
}
}
}
组任务
设置组任务处理人
在一些任务中,可能我们暂时不确定由哪一个或一组用户来完成,我们只能定位到几位用户,这在系统中为使用候选人 - Candidate Users 或 Candidate Groups。
当我们使用候选人时,任务的指派人会为空,而在候选人列会存在数据,并且一位候选人一条数据。