美文网首页SpringFramework
JBPM——流程中任务的分配

JBPM——流程中任务的分配

作者: 猿生进阶 | 来源:发表于2020-11-26 17:50 被阅读0次
捕获0.PNG

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 列表。一旦该组中有一个用户处理了该任务,那么这个任务对于其它用户就不再可见了。

相关文章

网友评论

    本文标题:JBPM——流程中任务的分配

    本文链接:https://www.haomeiwen.com/subject/hzhziktx.html