业务流程包括三部分:
- 活动 Activity / 节点 Node (有很多种,不同的类型有不同的功能,必须要有一个Start Activity)
- 连线 Transition / 转移 (从一个Activity指向另一个Activity)
- 事件 Event
Transition
开始活动中有且只能有一个连线,并且一个流程实例启动后,会在开始活动之后的一个活动处停下,所以只能有一个开始活动和连线.结束活动不能有连线.其它的活动可以一个或多个连线.当有一个或多个连线的时候,必须使用指定的连线名称离开当前活动,不指定连线名称默认为null,最多只能有一个名称为null的连线名称.相应的语法为:
TaskService.completeTask(taskId, outcome);
指定的连线的名称一定要和流程图上的连线名称相同,包括空格.如果没有找到相应的连线,则会抛出异常.
jBPM4.4中有很多地方都要用到连线名称,其API中也有很多种叫法,比如outcome、signalName、transionName 都是表示Transition的名称.variables、parameters都是表示流程变量的集合Map.
Activity
活动分为两种:预定义活动和自定义活动. 预定义活动就是可以可以直接使用的活动.比如Start,End等.
下面就对几种常见的预定义活动进行说明:
开始活动/Start
表示流程的开始,一个流程图中有且只能有一个Start.而且Start必须要有且只能有一个Transition.不能有其他的Transition指向Start,流程实例启动后,会离开开始活动.
结束活动/End
代表流程的结束,一个流程图中可以有0个或多个End.比如:
如果没有End,则执行完没有Transition的活动后,流程就结束了.
如果有多个End,则执行到其中任意一个End,流程就结束了.
任务活动/Task
代表在这里需要有一个人来做事情,事情做完后流程才能继续向后执行.
指定任务办理人时,可以使用assignee属性来指定.
生成任务时,默认只有这个指定的人才能看到任务和办理这个任务.
判断活动/Decision
使用Decision时要指定一个DecisionHandler的实现类来处理.比如有这么一个流程实例:
如果不大于2000,则部门经理直接办理,超过2000就要找总经理.要进行这个逻辑判断就要使用Decision,建立一个类实现DecisionHandler接口:
@SuppressWarnings("serial")
public class DecisionHandlerImpl implements DecisionHandler {
// 进行计算,得出并返回应使用的连线的名称
@Override
public String decide(OpenExecution execution) {
int money = (Integer) execution.getVariable("报销金额");
System.out.println("DecisionHandlerImpl.decide() ---> 报销金额=" + money);
if (money > 2000) {
return "to 总经理审批";
} else {
return "to end1";
}
}
}
我们说了流程变量的生命周期与流程实例的生命周期相同,金额由流程变量带过去.处理器类在Decision的Handler Class属性中指定.
分支/聚合 Fork/Join
Fork与Join要成对地使用.从一个Fork中分出的多个分支一定要再回到同一个Join中去.当流程执行到Fork中时,ProcessInstance会分成多个并行执行的子Execution,因为ProcessInstance继承自Execution,并且是个标记接口,所以说ProcessInstance只是一个概念,它是想表示整个Execution的执行,也就是主线的执行.