1. Task之任务分配人(assignee)
Task是一般来处理人机交互的活动,也是工作流中最为复杂的节点,许多元素还有子元素。我们先来看指派分配人。
<?xml version="1.0" encoding="UTF-8"?> <process name="TaskAssignee" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start1" g="137,21,48,48"> <transition name="to task1" to="task1" g="-52,-22" /> </start> <task name="task1" g="117,146,92,52" assignee="#{owner.name}"> <transition name="to state1" to="state1" g="-56,-22" /> </task> <state name="state1" g="121,280,92,52" /> </process>
通过流程变量#{owner.name}传入指派人的ID,当然owner类必须实现了序列化接口。
Owner类代码如下
package vo; import java.io.Serializable; public class AssigneeTaskVO implements Serializable { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
测试代码如下:
AssigneeTaskVO assigneeTaskVO = new AssigneeTaskVO(); assigneeTaskVO.setName("liuyan"); Map<String, Object> map = new HashMap<String, Object>(); map.put("owner", assigneeTaskVO); // 开始process流程 ProcessInstance processInstance = executionService .startProcessInstanceByKey("TaskAssignee", map); // 流程实例的ID String pid = processInstance.getId(); System.out.println(pid);// forkjoin.10001 List<Task> taskList = taskService.findPersonalTasks("liuyan"); for (Task task : taskList) { System.out.println(task.getAssignee()); }
2. Task之任务分配人与分配组
利用Task的candidate-groups和candidate-users可以指定分配组或者分配人。流程图雷同,我们来看xml定义如下:
<?xml version="1.0" encoding="UTF-8"?> <process name="TaskGroup" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start1" g="160,39,48,48"> <transition name="to task1" to="task1" g="-52,-22" /> </start> <task name="task1" g="136,142,92,52" candidate-groups="tibco"> <transition name="to state1" to="state1" g="-56,-22" /> </task> <state name="state1" g="134,251,92,52" /> </process>
这里制定了一个组名叫做“tibco”。
下面来看测试代码:
/** * 使用身份验证接口建立不同的用户、组、组成员 */ public void test02CreateGroup() { identityService.createGroup("tibco"); identityService.createGroup("vecinfo"); identityService.createUser("liuyan", "liuyan", "素还真"); identityService.createUser("fcl", "fcl", "风采铃"); identityService.createMembership("liuyan", "tibco"); identityService.createMembership("liuyan", "vecinfo"); identityService.createMembership("fcl", "vecinfo"); } /** * 发起流程 */ public void test03StartTask() { // 开始process流程 ProcessInstance processInstance = executionService .startProcessInstanceByKey("TaskGroup"); // 流程实例的ID String pid = processInstance.getId(); System.out.println(pid);// forkjoin.10001 } /** * 获得指定人的任务列表 */ public void test04GetAssigneeGroupTask() { List<Task> taskList1 = taskService.findPersonalTasks("liuyan"); for (Task task : taskList1) { System.out.println(task.getAssignee()); } List<Task> taskList2 = taskService.findPersonalTasks("fcl"); for (Task task : taskList2) { System.out.println(task.getAssignee()); } List<Task> taskList3 = taskService.findGroupTasks("liuyan"); for (Task task : taskList3) { System.out.println(task.getId());//20002 } List<Task> taskList4 = taskService.findGroupTasks("fcl"); for (Task task : taskList4) { System.out.println(task.getId()); } } /** * 争抢获取任务 */ public void test05ExeTask(){ taskService.takeTask("20002", "liuyan"); } /** * 完成任务 */ public void test06(){ taskService.completeTask("20002"); }
test02CreateGroup()使用身份验证接口创建了组:tibco和vecinfo,创建了用户:liuyan和fcl,并且建立了人员与组织的关系。tibco只有liuyan、vecinfo有liuyan和fcl。test04GetAssigneeGroupTask()执行结果可以看到用户liuyan有task,而fcl没有任何task。如果此时多个人都有task预备任务(把流程中的组名换成vecinfo)的时候,那么就是以争抢的方式来“夺取”该task来执行,谁先抢到,谁就可以执行任务,抢不到的人无法再争抢。