JBPM最常用的节点之一Task。
任务分配的几种方式
Assignee
此种方法直接在task标签中指定assignee,即分配人。
<?xml version="1.0" encoding="UTF-8"?>
<process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="243,29,48,48">
<transition name="提交到任务A" to="任务A" g="-63,-11"/>
</start>
<end name="end1" g="243,393,48,48"/>
<task assignee="A" name="任务A" g="224,115,92,52">
<transition name="提交到任务B" to="任务B" g="-77,-11"/>
</task>
<task assignee="B" name="任务B" g="220,221,92,52">
<transition name="提交到任务C" to="任务C" g="-83,-14"/>
</task>
<task assignee="C" name="任务C" g="224,308,92,52">
<transition name="通过" to="end1" g="-62,-25"/>
</task>
</process>
Candidate-groups(用户组候选任务):
首先,Candidate-groups是一个用户组,作为一个任务组来接受一个任务。在部署的时候设定这个任务组,并初始化其组中的用户。
在任务到达这个节点后,其中的用户利用List<Task> tasks = taskService.findPersonalTasks("a1")是拿不到这个任务的。必须用List<Task> tasks = taskService.findGroupTasks("a1");来查找这个任务。
或是利用taskService.takeTask("250002", "a1");将任务分配给a1,则只有a1能拿到这个任务。分配后只能用个人Personal的API能拿到这个任务。
接受任务
assignmentHandler(监听分配,在java代码中分配):jpdl代码如下
<process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="243,29,48,48">
<transition name="提交到任务A" to="任务A" g="-63,-11"/>
</start>
<end name="end1" g="243,393,48,48"/>
<task name="任务A" g="224,115,92,52">
<assignment-handler class="com.tgb.node.task.handler.AssignTask">
</assignment-handler>
<transition name="提交到任务B" to="任务B" g="-77,-11"/>
</task>
<task name="任务B" g="220,221,92,52">
<assignment-handler class="com.tgb.node.task.handler.AssignTaskB">
</assignment-handler>
<transition name="提交到任务C" to="任务C" g="-83,-14"/>
</task>
<task name="任务C" g="224,308,92,52">
<transition name="通过" to="end1" g="-62,-25"/>
</task>
</process>
java类代码如下:实现AssignmentHandler接口,用assignable动态设置人员
package com.tgb.node.task.handler;
import org.jbpm.api.model.OpenExecution;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.AssignmentHandler;
public class AssignTask implements AssignmentHandler {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void assign(Assignable assignable, OpenExecution execution)
throws Exception {
assignable.setAssignee("userA");
}
}
Swimlanes(泳道分配):
在jpdl文件中定义swimlane属性。
将不同的task任务分配给同一个人:将任务A和任务C分配给U1用户。
<?xml version="1.0" encoding="UTF-8"?>
<process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl">
<swimlane assignee="U1" name="mySwim"/>
<start g="243,29,48,48" name="start1">
<transition g="-63,-11" name="提交到任务A" to="任务A"/>
</start>
<end g="242,333,48,48" name="end1"/>
<task g="224,115,92,52" name="任务A" swimlane="mySwim">
<transition g="-65,-14" name="提交到任务B" to="任务B"/>
</task>
<task assignee="U2" g="427,115,92,52" name="任务B">
<transition g="-83,-14" name="提交到任务C" to="任务C"/>
</task>
<task g="222,207,92,52" name="任务C" swimlane="mySwim">
<transition g="-62,-25" name="通过" to="end1"/>
</task>
</process>
即任务A和任务C的指派人都为用户U1。