按照分配对象,可以分为:
- 分配给某个/些用户
- 或者分配给某个/些用户组。
从分配的方式看,可以有以下几种:
- 在流程设计的时候,就直接指定用户/用户组:
- 在流程设计的时候,可以通过assignee方式,直接分配给用户
- 明确的分配给某用户/用户组:
<task name="task1" assignee="username"> 这样直接把工作分配给该用户,这里只能是用户
- 从环境变量来
<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
- 在流程设计的时候,可以通过assignee方式,直接分配给用户
- 在程序执行的时候,动态确定:
这个在流程的xml中,也需要配置,到底哪个程序来确定。在Task节点中,需要配置任务分配器:
<assignment-handlerclass="className">
这个class是一个继承AssignmentHandler的类,只有一个方法:
void assign(Assignable assignable,OpenExecution execution) throws Exception;
Assignable是任务和泳道的通用接口。 所以任务分配处理器可以使用在任务, 也可以用在泳道中
assignable:可以完成上述的3种添加完成任务用户的方法:assignee、candidate-users、candidate-groups,
还有根据泳道(swimlane)进行分配用户
流程确定的情况下,有时候完成一个步骤人数不确定,在任务发布的时候有领导确定参与完成的人员。
为了完成这样的情况,可以到了这一步,通过配置动态的生成一些subTask,通过subTask给每个人进行分派工作。
其实还可以通过jBPM4.4中的foreach的方式进行完成(注意:这个功能还在孵化器中)。
如:完成一个审核工作,有些工作需要2个人完成,有些工作需要3个人完成,在开启流程的时候,由生成流程的人员进行指定对应的工作人员。
拿jBPM4.4开发指南中的例子来解释:
- <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>
- <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可以获得有哪些任务自己是候选者
)。
3. foreach自动生成的这些Task都完成了,则流程进入到下一步;