jBPM4.4:分配任务的几种方式 在执行期间动态分配任务执行人
从环境变量来
<task name="task1" assignee="#{order.saler}" > 这样直接把工作环境变量order对象的saler属性值所代表的用户在流程设计的时候,分配给一群用户 candidate-users
<task name="task1" candidate-users="usernameA,usernameB,usernameC" >在流程设计的时候,分配给一群用户组 candidate-groups
<task name="task1" candidate-groups="groupA,groupB,groupC" >在上述的2种方式:candidate-users、candidate-groups的方式,接收任务的人需要首先接收任务,才能进行处理,接收方式:taskService.takeTask
在程序执行的时候,动态确定:
这个在流程的xml中,也需要配置,到底哪个程序来确定。在Task节点中,需要配置任务分配器:
<assignment-handler name="code"><process name="ForEach" xmlns="http://jbpm.org/4.4/jpdl"> <start g="28,61,48,48" name="start1"> <transition to="foreach1"/> </start> <foreach var="department" in="#{departments}" g="111,60,48,48" name="foreach1"> <transition to="Collect reports"/> </foreach> <task candidate-groups="#{department}" g="201,58,92,52" name="Collect reports"> <transition to="join1"/> </task> <join g="343,59,48,48" multiplicity="#{quorum}" name="join1"> <transition to="end1"/> </join> <end g="433,60,48,48" name="end1"/></process>
?
1. 启动流程后,到达foreach节点: <foreach var="department" in="#{departments}" g="111,60,48,48" name="foreach1"> <transition to="Collect reports"/> </foreach>??参数:
in:表示从外面传入的参数,foreach会读取这个参数,这个参数可以是string数组,也可以是通过逗号分隔的字符串
var:这个变量是foreach将in中的内容按照规则进行拆分,拆分的结果放在var定义的变量中,传递给下一步(每一步接收一个值)
?
进入到foreach,解析完这些参数,会根据join中的multiplicity参数的值,生成task(multiplicity定义为几,就生成几个Executiuon,几个task),这些Task的assignee都是空的
?
2. 进入到task
<task candidate-groups="#{department}" g="201,58,92,52" name="Collect reports"> <transition to="join1"/> </task>
?
进入到task,其实现在有多个task,是根据join中的multiplicity来确定的。
?
这些task任务安排的人员在candidate-groups(或者是candidate-users等)中定义。这个例子#{department},就是在foreach节点中,定义的var="department"中的变量名字;
?
这些任务不是直接分派到用户的,而是需要用户自己进行take的
(通过TaskService.createTaskQuery().candidate(userId).list 可以获得有哪些任务自己是候选者
?? 或者通过TaskService.findGroupTasks(userId)获取有哪些任务是自己加入的组需要完成的,
? 或者在流程xml文件中,直接用assignee,分配给任务完成的人员
)。
?
3. foreach自动生成的这些Task都完成了,则流程进入到下一步;
?? 如果有部分人员完成,部分人员没有完成,还是可以查到foreach自动生成的所有Execution(通过processInstance.getExecutions()),不过根据任务完成的情况有不同的状态:
?? 如果任务已经完成,则在Task表中已经删除,得到的execution状态是:inactive-join
?? 没有完成的任务,在task中依旧存在,得到的execution状态是 active-concurrent
?
?