JBPM中任何一个task都必须指定一个任务的接收者,这个接收者可以是一个用户,也可以是一个用户组。如果指定给一个用户那么可以用这个用户的ID得到当前的task。如果是一个用户组那么这个组的任何一个用户都可以看到这个task,当这个组中的任何一个用户处理该任务后那么这个task对这个组中的其它用户就不再可见。
JBPM中任务的分配方式有两种:一种是为task指定一个assignment-handler,既一个实现了AssignmentHandler接口的类;另外一种是为task指定一个swimlane(泳道),swimlane可以在流程中定义好,一个流程中可以定义若干个swimlane,在定义一个swimlane时同样也是指定了个实现了AssignmentHandler接口的类,当我们的task指定了一个swimlane后,其效果同我们指定一个assignment-handler效果是一样的,只不过可以简化我们任务的分配工作。一个典型的实现了AssignmentHandler接口的类如下:
- import org.jbpm.graph.exe.ExecutionContext;
- import org.jbpm.taskmgmt.def.AssignmentHandler;
- import org.jbpm.taskmgmt.exe.Assignable;
- public class ManagerAssignment implements AssignmentHandler {
- public void assign(Assignable arg0, ExecutionContext arg1) throws Exception {
- String[] s = new String[5];
- for (int i = 0; i < 5; i++) {
- s[i] = "manager" + i;
- }
- // arg0.setActorId("manager0");//将任务分配给单个用户
- arg0.setPooledActors(s);// 将任务分配给一个用户组
- }
- }
assignment-handler方式的任务分配:
在JBPM中可以在start-node中添加一个task,在一个task-node中添加若干个task。每一个task我们都必须为其指定一个assignment-handler或一个swimlane,二者只能选其一。
- <start-state name="start">
- <task name="start task">
- <controller>
- <variable name="dayCount" access="read,write,required" mapped-name="请假天数">variable>
- controller>
- <assignment class="test.assignment.IssuePersonAssignment">assignment>
- task>
- <transition name="to manager approve" to="manager approve task">transition>
- start-state>
上面的代码中start节点中我们添加了一个start task的task,同时为其指定了一个assignment,所对应的class为test.assignment.IssuePersonAssignment ,该类的代码如下:在该类中,我们从整个流程中的取出一个名为Constants.ISSUE_PERSON的流程变量,并将其赋给当前的task,这里采用的是Assignable的setActorId的方法。这样当用户登录时就可以用
- JbpmContext context=JbpmConfiguration.getInstance().createJbpmContext();
- List ls=context.getTaskList(session.getAttribute("username").toString());
方法来取出对应的任务列表。
swimlane方式的任务分配:
该种方式的任务分配实际上是对assignment-handler方式任务分配的简化。首先用户需要在流程中定义好若干个swimlane,接下来只需要在task中指定一个swimlane就可以完成任务的分配工作。
- <swimlane name="manager">
- <assignment class="test.assignment.ManagerAssignment">assignment>
- swimlane>
- <task-node name="manager approve task">
- <task name="manager approve" swimlane="manager">
- <controller>
- <variable name="dayCount" access="read" mapped-name="员工请假天数">variable>
- <variable name="managerApprove" access="read,write,required" mapped-name="经理意见">variable>
- controller>
- task>
- <transition name="to user try" to="user try">transition>
- <transition name="to fork" to="fork1">transition>
- task-node>
上面的代码中我们指定了一个叫manager的swimlane,然后我们在一个名为manager approve的task里将该task指定给该swimlane,这样就完成了任务的分配。从这里我们可以看到与assignment-handler方式分配最大不同之处是该种分配任务的方式简单、明了。我们只需要预先定义好若干个swimlane之后就可以在task里重复使用了。test.assignment.ManagerAssignment类的代码如java代码一。
在这个类当中我们把任务分配给一个用户组(一个由用户ID组成的数组),这样该组中的每个用户登录后都可以采用以下方法看到任务列表:
- JbpmContext context=JbpmConfiguration.getInstance().createJbpmContext();
- List list=context.getTaskMgmtSession().findPooledTaskInstances(session.getAttribute("username").toString());
用这种方法,用户可以看到所有尚未处理的分配到该用户所在用户组中的task列表。一旦该组中有一个用户处理了该任务,那么这个任务对于其它用户就不再可见了。
- import org.jbpm.graph.exe.ExecutionContext;
- import org.jbpm.taskmgmt.def.AssignmentHandler;
- import org.jbpm.taskmgmt.exe.Assignable;
- public class IssuePersonAssignment implements AssignmentHandler {
- public void assign(Assignable arg0, ExecutionContext arg1) throws Exception {
- String issuePerson = arg1.getVariable(Constants.ISSUE_PERSON).toString();
- arg0.setActorId(issuePerson);
- }
- }