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>