JBPM中任务分配的几种方式

来源:互联网 发布:js过渡效果 编辑:程序博客网 时间:2024/06/09 15:27

   在jbpm中关于任务的分配常见的有以下四种方式:

1、Assignee

2、Candidate-groups

3、assignmentHandler

4、Swimlanes

   第一种分配方式在上一篇的博客中已经简单的应用了一下,我们可以通过assignee方式直接分配给用户Candidate-groups方式可以分配给用户组,通过AssignmentHandler在任务创建的时候分配任务:

    <assignment-handlerclass="com.tgb.node.task.handler.AssignTask"></assignment-handler>

   标签中的class是继承AssignementHandler的类,在这个类中只有一个方法:

public void assign(Assignable assignable, OpenExecution execution)throws Exception {assignable.setAssignee("userA");}

    另外在这个方法中我们需要一个序列化ID。Swimlane的方式分配任务.通过第(3)种方式来分配任务时,虽然灵活,但是如果要将多个任务分配给同一个处理人时我们不得不编写多个handler类,造成java类的过度膨胀;这时候就可以通过Swimlane的方式来分配任务,多个相同处理人的Task结点只引用定义好的Swimlane就可以完成任务分配。

下面我们用例子简单理解这几种方式的应用。

1、采用Candidate-groups方式:

jpdl文件如下:

<?xml version="1.0" encoding="UTF-8"?><process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl">   <start name="start1" g="297,16,48,48">      <transition name="提交到任务A" to="任务A" g="-60,-9"/>   </start>   <end name="end1" g="302,364,31,48"/>   <task candidate-groups="manager" name="任务A" g="273,99,92,52">      <transition name="提交到任务B" to="任务B" g="-52,-13"/>   </task>   <task name="任务B" g="277,189,92,52">      <transition name="提交到任务C" to="任务C" g="-51,-9"/>   </task>   <task name="任务C" g="281,273,92,52">      <transition name="通过" to="end1" g="-42,-13"/>   </task></process>
    用户组的名称为manager,在java代码中,我们需要给这个组分配用户:
public void deploy() {super.startUp();String group=identityService.createGroup("manager");identityService.createUser("g1", "tom", "uu");identityService.createUser("g2", "tom2", "uu2");identityService.createMembership("g1",group);identityService.createMembership("g2",group);repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/task/Candidate/task3.jpdl.xml").deploy();}

   g1和g2都是manager组中的用户,当一个用户完成任务之后,节点不会继续往下进行,只有这个组中的所有用户都完成任务之后,节点才会往下走。

2、采用assignee-handler监听方式:

<?xml version="1.0" encoding="UTF-8"?><process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl">   <start name="start1" g="297,16,48,48">      <transition name="提交到任务A" to="任务A" g="-60,-9"/>   </start>   <end name="end1" g="302,364,31,48"/>   <task name="任务A" g="273,99,92,52">   <assignment-handler class="com.tgb.node.task.handler.AssignTask">      </assignment-handler>      <transition name="提交到任务B" to="任务B" g="-52,-13"/>   </task>   <task name="任务B" g="277,189,92,52">   <assignment-handler class="com.tgb.node.task.handler.AssignTaskB">      </assignment-handler>      <transition name="提交到任务C" to="任务C" g="-51,-9"/>   </task>   <task name="任务C" g="281,273,92,52">      <transition name="通过" to="end1" g="-42,-13"/>   </task></process>

   采用这种监听方式,在运行时他会自动监听相关联的java类,然后运行监听类中的assign方法,在监听类中会分配用户。

3、采用SWimlanes泳道方式:

<?xml version="1.0" encoding="UTF-8"?><process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl"><swimlane name="mySwim" assignee="U1"></swimlane>   <start name="start1" g="297,16,48,48">      <transition name="提交到任务A" to="任务A" g="-60,-9"/>   </start>   <end name="end1" g="302,364,31,48"/>   <task swimlane="mySwim" name="任务A" g="273,99,92,52">      <transition name="提交到任务B" to="任务B" g="-52,-13"/>   </task>   <task assignee="U2" name="任务B" g="277,189,92,52">      <transition name="提交到任务C" to="任务C" g="-51,-9"/>   </task>   <task swimlane="mySwim" name="任务C" g="281,273,92,52">      <transition name="通过" to="end1" g="-42,-13"/>   </task></process>

   泳道和UML中的泳道是类似的,它的一个最大的特点就是在一个泳道中的任务是同一个用户完成的。

   在这四种分配任务方式中,我们最常使用的就是第一种,如果需要给用户组分配任务,我们可以选择第二中,如果当我们想要监听另外的java类时,我们可以选择第三种,如果有同一个用户会完成多个任务的时候,我们可以采用泳道的分配方式,每种任务的分配方式各有优缺点,我们要根据任务的实际情况而定。







0 0