jbpm4学习之任务分配

//from http://wuyuetian.iteye.com/blog/644802

在jbpm4中,必须给任务分配参与者(assignee),我总结了下,有以下的几种方法

一,直接在jpdl.xml文件中指明参与者,如:

Xml代码  收藏代码
  1. <task name=”review” g=”280,146,92,52″ assignee=”zcl”>
  2.      <transition name=”to wait” to=”wait” g=”-25,-25″/>
  3.   </task>

这样在程序中就可以直接使用zcl作为用户的id了。当然这并不常用。

二,通过使用流程实例变量获得

Xml代码  收藏代码
  1. <task name=”review” g=”280,146,92,52″ assignee=”#{owner}”>
  2.       <transition name=”to wait” to=”wait” g=”-25,-25″/>
  3. </task>

在程序中可以这样分配参与者:

Java代码  收藏代码
  1. Map<String, Object> variables = new HashMap<String, Object>();
  2. variables.put(“owner”, ”zcl”);
  3. executionService.startProcessInstanceByKey(“assignee”, variables);

三,通过流程实例变量的导航

Jpdl.xml代码  收藏代码
  1. <task name=”review” g=”280,146,92,52″ assignee=”#{order.owner}”>
  2.       <transition name=”to wait” to=”wait” g=”-25,-25″/>
  3. </task>

其中#{order.owner}相当于调用了order所代表类的getOwner()方法,因此首先得定义一个类,其中包括getOwner()方法,此类必须实现Serializable 接口。

Java代码  收藏代码
  1. public class Order implements Serializable {
  2.     private String owner;
  3.     public Order() {}
  4.     public Order(String owner) {
  5.         this.owner = owner;
  6.     }
  7.     public String getOwner() {
  8.         return owner;
  9.     }
  10.     public void setOwner(String owner) {
  11.         this.owner = owner;
  12.     }
  13. }

在程序中这样指定:

Java代码  收藏代码
  1. Map<String, Object> variables = new HashMap<String, Object>();
  2. variables.put(“order”, new Order(“zcl”));
  3. executionService.startProcessInstanceByKey(“assignee1″, variables);

四,通过实现AssignmentHandler接口来分配参与者

Java代码  收藏代码
  1. <task name=”review” g=”280,146,92,52″>
  2.   <assignment-handler class=”cn.zcl.jbpm4.task.assignee.AssigTask”>
  3.     <field name=”owner”>
  4.         <string value=”zcl”/>
  5.      </field>
  6.   </assignment-handler>
  7.   <transition name=”to wait” to=”wait” g=”-25,-25″/>
  8. </task>

再定义AssigTask类

Java代码  收藏代码
  1. public class AssigTask implements AssignmentHandler {
  2.     private String owner;
  3.     @Override
  4.     public void assign(Assignable assignable, OpenExecution execution)
  5.             throws Exception {
  6.         assignable.setAssignee(owner);//分配任务参与者
  7.     }
  8. }

这样就给任务分配了参与者了,将zcl分配给了当前的任务

测试程序

Java代码  收藏代码
  1. executionService.startProcessInstanceByKey(“assignee2″);
  2. List<Task> tasks = taskService.findPersonalTasks(“zcl”);
  3. assertEquals(“任务数不是1″, 1, tasks.size());
  4. Task task = tasks.get(0);
  5. taskService.completeTask(task.getId());
  6. tasks = taskService.findPersonalTasks(“zcl”);
  7. assertEquals(“没有任务”, 0, tasks.size());

五,通过candidates给任务分配参与者

Xml代码  收藏代码
  1. <task name=”review” g=”280,151,92,52″ candidate-groups=”groups”>
  2.       <transition name=”to wait” to=”wait” g=”-56,-22″/>
  3. </task>

在程序中这样调用

Java代码  收藏代码
  1. String groupId = identityService.createGroup(“groups”);
  2. identityService.createUser(“zcl”, ”zcl”, ”z”);
  3. identityService.createUser(“ch”, ”ch”, ”c”);
  4. identityService.createMembership(“zcl”, groupId);
  5. identityService.createMembership(“ch”, groupId);

这样就把任务同时分派给了zcl和ch

下面是测试程序:

Java代码  收藏代码
  1. List<Task> tasks1 = taskService.findPersonalTasks(“zcl”);
  2. assertEquals(“是否相等”, 0, tasks1.size());
  3. List<Task> tasks2 = taskService.findPersonalTasks(“ch”);
  4. assertEquals(“是否相等”, 0, tasks2.size());
  5. tasks1 = taskService.findGroupTasks(“zcl”);
  6. assertEquals(“是否相等”, 1, tasks1.size());
  7. tasks2 = taskService.findGroupTasks(“ch”);
  8. assertEquals(“是否相等”, 1, tasks2.size());
  9. Task task = tasks1.get(0);
  10. taskService.takeTask(task.getId(), ”zcl”);//组任务被zcl接受了
  11. tasks1 = taskService.findGroupTasks(“zcl”);
  12. assertEquals(“是否相等”, 0, tasks1.size());
  13. tasks2 = taskService.findGroupTasks(“ch”);
  14. assertEquals(“是否相等”, 0, tasks2.size());
  15. tasks1 = taskService.findPersonalTasks(“zcl”);
  16. assertEquals(“是否相等”, 1, tasks1.size());
  17. tasks2 = taskService.findPersonalTasks(“ch”);
  18. assertEquals(“是否相等”, 0, tasks2.size());
  19. taskService.completeTask(task.getId());
  20. tasks1 = taskService.findPersonalTasks(“zcl”);
  21. assertEquals(“是否相等”, 0, tasks1.size());
  22. tasks2 = taskService.findPersonalTasks(“ch”);
  23. assertEquals(“是否相等”, 0, tasks2.size());

六,通过swimlanes来分配

Xml代码  收藏代码
  1. <swimlane candidate-groups=”groups” name=”sales representative”/>
  2. <start g=”135,185,48,48″ name=”start1″>
  3.       <transition g=”-58,-22″ name=”to review” to=”review”/>
  4.    </start>
  5.    <task g=”247,182,92,52″ name=”review” swimlane=”sales representative”>
  6.       <transition name=”to check” to=”check” g=”-25,-25″/>
  7.    </task>

在程序中这样使用:

Java代码  收藏代码
  1. identityService.createGroup(“groups”);
  2.         identityService.createUser(“zcl”, ”zcl”, ”z”);
  3.         identityService.createUser(“cn”, ”cn”, ”c”);
  4.         identityService.createMembership(“zcl”, ”groups”, ”develop”);
  5.         identityService.createMembership(“cn”, ”groups”, ”develop”);
  6. executionSerivce.startProcessInstanceByKey(“swimlanes”);
  7. List<Task> tasks1 = taskService.findPersonalTasks(“zcl”);
  8. assertEquals(“是否相等”, 0, tasks1.size());
  9. List<Task> tasks2 = taskService.findPersonalTasks(“cn”);
  10. assertEquals(“是否相等”, 0, tasks2.size());
  11. tasks1 = taskService.findGroupTasks(“zcl”);
  12. assertEquals(“是否相等”, 1, tasks1.size());
  13. tasks2 = taskService.findGroupTasks(“cn”);
  14. assertEquals(“是否相等”, 1, tasks2.size());
  15. Task task = tasks1.get(0);
  16. taskService.takeTask(task.getId(), ”zcl”);
  17. tasks1 = taskService.findGroupTasks(“zcl”);
  18. assertEquals(“是否相等”, 0, tasks1.size());
  19. tasks2 = taskService.findGroupTasks(“cn”);
  20. assertEquals(“是否相等”, 0, tasks2.size());
  21. tasks1 = taskService.findPersonalTasks(“zcl”);
  22. assertEquals(“是否相等”, 1, tasks1.size());
  23. tasks2 = taskService.findPersonalTasks(“cn”);
  24. assertEquals(“是否相等”, 0, tasks2.size());
  25. taskService.completeTask(task.getId());
  26. tasks1 = taskService.findPersonalTasks(“zcl”);
  27. assertEquals(“是否相等”, 1, tasks1.size());
  28. tasks2 = taskService.findPersonalTasks(“cn”);
  29. assertEquals(“是否相等”, 0, tasks2.size());
This entry was posted in Computer, Java. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s