JBPM中任务分配的几种方式

   在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类时,我们可以选择第三种,如果有同一个用户会完成多个任务的时候,我们可以采用泳道的分配方式,每种任务的分配方式各有优缺点,我们要根据任务的实际情况而定。







评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值