一 : 重要概念
1 : process definition(流程定义):
工作流的流程的完整定义,包括节点和节点之间的走向等关键信息。通常以xml格式提供。一个具体的系统往往是由许多个流程组成的。
2 : process instance(流程实例):
每个process defination生成的业务层的实例。当process instance创建以后,代表流程的执行路径,并被定义到开始节点。
3 : token(令牌):
表示了一个执行的路径,它是运行时产生的。当实例建立以后,令牌也就产生了。
4 : node:
表示流程中的一个节点。
5 : transition:
关联两个节点,用于表示节点的走向
6 : signal:
让一个token执行下一步。process instance也有signal,当用process instance的signal时,其实就是运行process instance根令牌(root token)的signal. 当token进入到一个node时,node会被执行,并产生一些事件,比如进入、离开节点等,这也是执行业务逻辑的地方。事件由action来表示。
7 : 事件Event
Event反映的是流程执行中的各个时刻。在流程执行中JBPM引擎会在计算下一个状态的时候触发各种事件。一个事件通常和流程定义中的一个元素相关联,比如流程定义本身,节点或者转移。大部分的元素能够触发不同类型的事件,比如一个节点可以触发节点进入事件,节点离开事件。事件其实是和动作连接在一起的。每个事件维护一个动作列表。当JBPM引擎触发一个事件的时候,该事件维护的动作列表中的动作将被执行。
事件类型
在JBPM中事件类型是写死在事件类中的,共有16种:
EVENTTYPE_TRANSITION = "transition"; // 转移
EVENTTYPE_BEFORE_SIGNAL = "before-signal"; // 发信号前
EVENTTYPE_AFTER_SIGNAL = "after-signal"; // 发信号后
EVENTTYPE_PROCESS_START = "process-start"; // 处理开始状态
EVENTTYPE_PROCESS_END = "process-end"; // 处理结束状态
EVENTTYPE_NODE_ENTER = "node-enter"; // 进入节点
EVENTTYPE_NODE_LEAVE = "node-leave"; // 离开节点
EVENTTYPE_SUPERSTATE_ENTER = "superstate-enter"; // 进入超级状态
EVENTTYPE_SUPERSTATE_LEAVE = "superstate-leave"; // 离开超级状态
EVENTTYPE_SUBPROCESS_CREATED = "subprocess-created"; // 子流程创建
EVENTTYPE_SUBPROCESS_END = "subprocess-end"; // 子流程结束
EVENTTYPE_TASK_CREATE = "task-create"; // 任务创建
EVENTTYPE_TASK_ASSIGN = "task-assign"; // 任务分派
EVENTTYPE_TASK_START = "task-start"; // 任务启动
EVENTTYPE_TASK_END = "task-end"; // 任务结束
EVENTTYPE_TIMER = "timer"; // 定时器
二 : 常用 API
ProcessInstance是ProcessDefinition的一个执行实例,想象一下对于订票流程,每个客户的订票动作都会根据订票流程定义而创建一个流程实例,也就是执行实例ProcessInstance.当一个ProcessInstance被创建后,负责执行主路径的token也被创建,这个token就是根token(root token),根token此时位于流程定义的开始状态start state.
创建执行实例很简单有2种方式 :
1 : 通过 ProcessDefinition 类的 createProcessInstance() 方法
//得到 processDefinition
ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("processdefinition.xml");
//通过 processDefinition 创建 出 processInstance
ProcessInstance processInstance = processDefinition.createProcessInstance();
2 :通过 ProcessInstance 类的 构造函数
//得到 jbpmContext
JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
//得到 processDefinition
ProcessDefinition processDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition("baoxiao");
//得到 processInstance
ProcessInstance processInstance = new ProcessInstance(processDefinition);