jbpm入门 任务控制

流程中任务的分配:

JBPM中任何一个task都必须指定一个任务的接收者,这个接收者可以是一个用户,也可以是一个用户组。如果指定给一个用户那么可以用这个用户的ID得到当前的task。如果是一个用户组那么这个组的任何一个用户都可以看到这个task,当这个组中的任何一个用户处理该任务后那么这个task对这个组中的其它用户就不再可见。
JBPM中任务的分配方式有两种:一种是为task指定一个assignment-handler,既一个实现了AssignmentHandler接口的类;另外一种是为task指定一个swimlane(泳道),swimlane可以在流程中定义好,一个流程中可以定义若干个swimlane,在定义一个swimlane时同样也是指定了个实现了AssignmentHandler接口的类,当我们的task指定了一个swimlane后,其效果同我们指定一个assignment-handler效果是一样的,只不过可以简化我们任务的分配工作。一个典型的实现了AssignmentHandler接口的类如下:

java 代码
  1. import org.jbpm.graph.exe.ExecutionContext;   
  2. import org.jbpm.taskmgmt.def.AssignmentHandler;   
  3. import org.jbpm.taskmgmt.exe.Assignable;   
  4.   
  5. public class ManagerAssignment implements AssignmentHandler {   
  6.   
  7.     public void assign(Assignable arg0, ExecutionContext arg1) throws Exception {   
  8.         String[] s = new String[5];   
  9.         for (int i = 0; i < 5; i++) {   
  10.             s[i] = "manager" + i;   
  11.         }   
  12.         // arg0.setActorId("manager0");//将任务分配给单个用户   
  13.         arg0.setPooledActors(s);// 将任务分配给一个用户组   
  14.     }   
  15.   
  16. }  

assignment-handler方式的任务分配:

在JBPM中可以在start-node中添加一个task,在一个task-node中添加若干个task。每一个task我们都必须为其指定一个assignment-handler或一个swimlane,二者只能选其一。

xml 代码
  1. <start-state name="start">  
  2. <task name="start task">  
  3. <controller>  
  4. <variable name="dayCount" access="read,write,required" mapped-name="请假天数">variable>  
  5. controller>  
  6. <assignment class="test.assignment.IssuePersonAssignment">assignment>  
  7. task>  
  8. <transition name="to manager approve" to="manager approve task">transition>  
  9. start-state>  

上面的代码中start节点中我们添加了一个start task的task,同时为其指定了一个assignment,所对应的class为test.assignment.IssuePersonAssignment ,该类的代码如下:在该类中,我们从整个流程中的取出一个名为Constants.ISSUE_PERSON的流程变量,并将其赋给当前的task,这里采用的是Assignable的setActorId的方法。这样当用户登录时就可以用

java 代码
  1. JbpmContext context=JbpmConfiguration.getInstance().createJbpmContext();   
  2. List ls=context.getTaskList(session.getAttribute("username").toString());  

方法来取出对应的任务列表。

swimlane方式的任务分配:

该种方式的任务分配实际上是对assignment-handler方式任务分配的简化。首先用户需要在流程中定义好若干个swimlane,接下来只需要在task中指定一个swimlane就可以完成任务的分配工作。

  1. <swimlane name="manager">  
  2. <assignment class="test.assignment.ManagerAssignment">assignment>  
  3. swimlane>  
  4. <task-node name="manager approve task">  
  5. <task name="manager approve" swimlane="manager">  
  6. <controller>  
  7. <variable name="dayCount" access="read" mapped-name="员工请假天数">variable>  
  8. <variable name="managerApprove" access="read,write,required" mapped-name="经理意见">variable>  
  9. controller>  
  10. task>  
  11. <transition name="to user try" to="user try">transition>  
  12. <transition name="to fork" to="fork1">transition>  
  13. task-node>  

上面的代码中我们指定了一个叫manager的swimlane,然后我们在一个名为manager approve的task里将该task指定给该swimlane,这样就完成了任务的分配。从这里我们可以看到与assignment-handler方式分配最大不同之处是该种分配任务的方式简单、明了。我们只需要预先定义好若干个swimlane之后就可以在task里重复使用了。test.assignment.ManagerAssignment类的代码如java代码一。

在这个类当中我们把任务分配给一个用户组(一个由用户ID组成的数组),这样该组中的每个用户登录后都可以采用以下方法看到任务列表:

  1. JbpmContext context=JbpmConfiguration.getInstance().createJbpmContext();   
  2. List list=context.getTaskMgmtSession().findPooledTaskInstances(session.getAttribute("username").toString());  

用这种方法,用户可以看到所有尚未处理的分配到该用户所在用户组中的task列表。一旦该组中有一个用户处理了该任务,那么这个任务对于其它用户就不再可见了。

 

 

 

java 代码
  1. import org.jbpm.graph.exe.ExecutionContext;   
  2. import org.jbpm.taskmgmt.def.AssignmentHandler;   
  3. import org.jbpm.taskmgmt.exe.Assignable;   
  4.   
  5. public class IssuePersonAssignment implements AssignmentHandler {   
  6.   
  7.     public void assign(Assignable arg0, ExecutionContext arg1) throws Exception {   
  8.         String issuePerson = arg1.getVariable(Constants.ISSUE_PERSON).toString();   
  9.         arg0.setActorId(issuePerson);   
  10.     }   
  11.   
  12. }  

你可能感兴趣的:(java,Basis,JBPM,Access,工作)