JBPM 中任何一个 task 都必须指定一个任务的接收者,这个接收者可以是一个用户,也可以是一个用户组。如果指定给一个用户那么可以用这个用户的 ID 得到当前的 task。如果是一个用户组那么这个组的任何一个用户都可以看到这个 task,当这个组中的任何一个用户处理该任务后那么这个 task 对这个组中的其它用户就不再可见。
JBPM 中任务的分配方式有两种:
一种是为 task 指定一个 assignment-handler,既一个实现了 AssignmentHandler 接口的类;
另外一种是为 task 指定一个 swimlane(泳道),swimlane 可以在流程中定义好,一个流程中可以定义若干个 swimlane,在定义一个 swimlane 时同样也是指定了个实现了 AssignmentHandler 接口的类,当我们的 task 指定了一个 swimlane 后, 其效果同我们指定一个 assignment-handler 效果是一样的,只不过可以简化我们任务的分配工作。一个典型的实现了 AssignmentHandler 接口的类如下:
package test.assignment;
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);//将任务分配给一个用户组
}
4.1 assignment-handler 方式的任务分配
在 JBPM 中可以在 start-node 中添加一个 task,在一个 task-node 中添加若干个 task。每一个 task 我们都必须为其指定一个 assignment-handler 或一个 swimlane,二者只能选其一。
上面的代码中start 节点中我们添加了一个start task 的task,同时为其指定了一个 assignment,所对应的 class 为 test.assignment.IssuePersonAssignment ,该类的代码如下:
<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>
package test.assignment;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.taskmgmt.def.AssignmentHandler;
import org.jbpm.taskmgmt.exe.Assignable;
import test.common.Constants;
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);
}
}
在该类中,我们从整个流程中的取出一个名为 Constants.ISSUE_PERSON 的流程变量, 并将其赋给当前的 task,这里采用的是 Assignable 的 setActorId 的方法。这样当用户登录时就可以用
JbpmContext
context=JbpmConfiguration.getInstance().createJbpmContext();
List
ls=context.getTaskList(session.getAttribute("username").toString());
方法来取出对应的任务列表。
4.2 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 类的代码如下:
package test.assignment;
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.setPooledActors(s);//将任务分配给一个用户组
}
}
在这个类当中我们把任务分配给一个用户组(一个由用户 ID 组成的数组),这样该组中的每个用户登录后都可以采用以下方法看到任务列表:
JbpmContext
context=JbpmConfiguration.getInstance().createJbpmContext();
List
list=context.getTaskMgmtSession().findPooledTaskInstances(session.get Attribute("username").toString());
用这种方法,用户可以看到所有尚未处理的分配到该用户所在用户组中的 task 列表。一旦该组中有一个用户处理了该任务,那么这个任务对于其它用户就不再可见了。
网友评论