概念:
流程图的组成:
a. 活动 Activity / 节点 Node
b. 流转 Transition / 连线(单向箭头)
c. 事件
1.流转(Transition)
a) 一般情况一个活动中可以指定一个或多个Transition
i. 开始活动(Start)中只能有一个Transition。
ii. 结束活动(End)中没有Transition。
iii. 其他活动中有一条或多条Transition
b) 如果Transition只有一个,则可以不指定名称(名称是null);如果有多个,则要分别指定唯一的名称。
2.活动(Activity)
a) 流转控制活动(预定义活动)
i. start开始活动
代表流程的开始边界,一个流程有且只能有一个Start活动。开始活动只能指定一个Transition。在流程实例启动后,会 自动的使用这个唯一的Transition离开开始活动,到一下个活动。
ii. end/end-error/end-cancel(结束活动)
代表流程的结束边界,可以有多个,也可以没有。如果有多个,则到达任一个结束活动,整个流程就都结束了;如果没 有,则到达最后那个没有Transition的活动,流程就结束了。
iii. state状态活动
作用:等待。可以使用signal使其结束等待,并向后执行一步。
iv. task任务活动
-->个人任务的分配
1. 使用流程变量:assignee="#{manager}"
2. AssignmentHandler:assignable.setAssignee(userId); // 指定当前任务的办理人(分配任务)
a) 需要在.jbdl.xml的<task>元素中写
b) 指定的AssignmentHandlerImpl类要实现AssignmentHandler接口
c) 在AssignmentHandlerImpl类中可以使用assignable.setAssignee(userId),分配个人任务。
3. TaskService.assignTask(taskId, userId)// 把指定的任务分配给指定的人
processEngine.getTaskService().assignTask(taskId, userId);
-->组任务的分配
1. 使用流程变量:assignee="#{userIdsString}" // 要是String型的变量,多个候选人之前用','隔开
2. AssignmentHandler:assignable.addCandidateUser(userId);// 添加组任务的候选人
a) 需要在.jbdl.xml的<task>元素中写
b) 指定的AssignmentHandlerImpl类要实现AssignmentHandler接口
c) 在AssignmentHandlerImpl类中可以使用assignable.addCandidateUser(userId),添加组任务候选人。
3. TaskService.addTaskParticipatingUser(taskId,userId,Participation.CANDIDATE);//添加组任务的候选人
v. Decision判断活动
1. 使用expression,如:expr="#{'to state2'}"
2. 使用Handler,在Handler Class里配置指定的DecisionHandlerImpl类的路径
DecisionHandlerImpl.java
ProcessTest.java
此时,如果variables.put("请假天数", 3);启动流程实例后,进行到to end1环节。
此时,如果variables.put("请假天数", 10);启动流程实例后,进行到to 总经理审批环节。
3. 如果同时配置了expression与Handler,则expression有效,忽略Handler。
vi. fork、join分支/聚合活动
输出结果为:
processInstanceId = test.330007
当前正在执行的活动:[汇款, 发货]
可以看出,汇款和发货同时执行中。并且,只有当2条路线都到join活动,流程才会继续往后执行。
b) 自定义活动(custom)
i. 在<custom>元素中指定class属性为指定的类ExternalActivityBehaviourImpl
ii. 这个类要实现ExternalActivityBehaviour接口,其中有两个方法:
1. execute(ActivityExecution):节点的功能代码
2. signal(ActivityExecution, String, Map):在当前节点等待时,外部发信号时的行为
3. 在execute()方法中,可以调用以下方法对流程进行控制
a) ActivityExecution.waitForSignal():在当前节点等待。
b) ActivityExecution.takeDefaultTransition():使用默认的Transition离开,当前节点中定义的第一个为默认的。
c) ActivityExecution.take(String transitionName):使用指定的Transition离开
d) ActivityExecution.end():结束流程实例
4. 也可以实现 ExternalActivityBehaviour 接口,只有一个方法 execute(ActivityExecution),这样就不能等待,否则 signal 时会有类转换异常。
3.事件
a) 在根元素中,或在节点元素中,使用<on event="">元素指定事件,其中event属性代表事件的类型。
b) 在<on>中用子元素<event-listener class="EventListenerImpl" />,指定处理的类,要求指定的类要实现 EventListener 接口
c) 事件类型:
i. <on>元素放在根元素(<process>)中,可以指定event为start或end,表示流程的开始与结束。
ii. <on>元素放在节点元素中,可以指定event为start或end,表示节点的进入与离开
iii. 在Start节点中只有end事件,在End节点中只有start事件。
iv. 在<transition>元素中直接写<event-listener class="">,就是配置事件。(因为在这里只有一个事件,所以不用写on与类型)
v. 在<task>元素中还可以配置assign事件,是在分配任务时触发的。
根据上述.jpdl.xml和对应的.png图,启动流程实例会执行3次 EventListenerImpl 事件,结束流程实例也会执行3次 EventListenerImpl 事件。