一、因为加入了不同的分支流向,所以当审批不通过要驳回时JBPM应该能够得到当初提交任务的参与者,
而这个工作通过直接用actor-id=#{}来实现并不合适,因为如果有很多这样的指定的话,
可能会乱套,JBPM提供了一个专门能解决该问题的机制。
解决方法:使用泳道,它是定义流程中的多个任务由相同参与者完成的一种机制,这使的泳道正好能够完成任务。
在第一个任务实例为指定泳道创建后,参与者将被流程记住,以被在同一泳道中的后续任务所使用。
泳道有一个分配,因此所有引用泳道的任务不需要再指定分配。
**注意:可以在<start-state>开始节点添加一个任务<task>,用swimlane机制来记录流程的启动者
**实现:这里实现了泳道机制
用法:一般放到流程定义文件顶部的位置定义<swimlane>
<swimlane name="swimlane名字供task应用">
<assignment class="处理类名字"/>
</swimlane>
或
<swimlane name="swimlane名字供task应用">
<!--当然这里也可以写死,即actor-id="username"-->
<assignment actor-id="#{变量}"/>
</swimlane>
//应用后就不用再为当前的task分配参与者了,分配任务交给swimlane完成
<task name="任务名字" swimlane="上面定义的swimlane名字"></task>
**项目中为了使用swimlane而做的更改有两处:
1.processdefinition.xml文件中加入了swimlane元素,用它来完成分配任务的参与者
2.在startProcessInstance.jsp文件中,为参与者变量赋值的那句代码发生了改变,
改为为swimlane中指定的任务参与者赋值:
processInstance.getContextInstance().setVariable("starter",userId);
二、项目复杂度增加,流程定义文件加入两个节点,一个是"通知申请人审批",另一个是"人力资源部审批",
其中"通知申请人审批"仍然由表单提交者,即申请人来完成任务。为此我们正好利用了泳道swimlane的好处。
<!-- 这样写的意思是当总经理审批通过之后,申请人还要到人力资源那里咨询一下,
当然咨询的任务由申请人去做,这就是使用swimlane的好处,当流程中有多个任务是同一个参与者参与的时候,
使用swimlane只需指定swimlane分配的任务参与者的引用即可 -->
对于"人力资源部审批",我们又加入了一个人力资源经理,也就是登陆界面加入了一个下拉框选项,这样增加一个参与者。
三、对流程定义中的分配任务参与者机制再次修改:将部门经理审批中通过actor-id写死的值,改成通过class类来动态指定actor-id的值,
即指定一个类名,然后该类要实现AssignmentHandler接口,实现类中的方法会在执行到对应的任务之前被调用,以便顺利分配任务
的参与者