JBPM具体应用之task节点的使用

task节点是最常用的节点之一,也因为执行任务的情况有很多种,所以他的用法也是多种多样的,本文主要讲解task的三种用法分别如下:

1.candidate属性。该熟属性在于task节点中,他的作用类似于组内工作分配,假如一个组内有两个人a1和a2,将该属性所在任务分配给两人中的一个后,则只有该任务被分配人才能看到任务,其他人都看不到。首先来看jpdl文件:

<?xml version="1.0" encoding="UTF-8"?>
  
<process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl">
   <start name="start1" g="290,1,48,48">
      <transition name="提交到任务A" to="任务A" g="-52,-20"/>
   </start>
   <end name="end1" g="309,338,48,48"/>
   <task candidate-groups="mgr" name="任务A" g="272,84,92,52">
      <transition name="提交到任务B" to="任务B" g="-52,-20"/>
   </task>
   <task name="任务B" g="278,171,92,52">
      <transition name="提交到任务C" to="任务C" g="-52,-20"/>
   </task>
   <task name="任务C" g="286,255,92,52">
      <transition name="通过" to="end1" g="-50,-20"/>
   </task>
</process>

注意上面的jpdl文件中存在candidate-groups属性,其值为“mgr”,这样在后台对应创建该组并为该组添加组员的java代码如下:

public class TestTask3 extends JbpmTestCase implements JbpmUtil {

	@Override
	public void deploy() {
		super.startUp();
		String group = identityService.createGroup("mgr");
		identityService.createUser("a1", "tom", "uu");
		identityService.createUser("a2", "tom2", "uu2");
		identityService.createMembership("a1", group);
		identityService.createMembership("a2", group);
		
		repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/task/Candidate/task3.jpdl.xml").deploy();

	}

	@Override
	public void createInstance() {
		super.startUp();
		ProcessInstance processInstance = executionService.startProcessInstanceByKey("task");
		print("流程实例ID",processInstance.getId());

	}

	@Override
	public void getTask() {
		super.startUp();
		//把任务分配给a1
		taskService.takeTask("20002", "a2");
		List<Task> tasks = taskService.findPersonalTasks("a2");
		print("任务数量",tasks.size());
		print("任务名词",tasks.get(0).getActivityName());
		print("任务ID",tasks.get(0).getId());
	}

	public void getGroupTask(){
		super.startUp();
		List<Task> tasks = taskService.findGroupTasks("a2");
		print("任务数量",tasks.size());
		print("任务名词",tasks.get(0).getActivityName());
		print("任务ID",tasks.get(0).getId());
	}
	@Override
	public void completeTask() {
		super.startUp();
		taskService.completeTask("350001");
	}

}
需要注意的是在我们部署流程的时候就创建了两个组员a1和a2,并且将这两个人加入到了mgr组,当执行创建流程以后由于改组得到了任务,但是这个任务没有分配给具体的组员,所以凡是这个组的组员都可以看到这个任务,也就是说当执行getGroupTask()的时候,无论是a1还是a2都有共同的任务,但是当执行getTask()把任务分配给a2以后,组任务也就随之消失,这时执行getGroupTask()函数无论参数是a1还是a2都获取不到任务了。原因就在于没分配之前是组任务,分配之后变成了私人任务,组任务这个概念也就没有了。只有在执行getTask()并且参数为a2的时候才能看到此任务。

2.task节点的handler属性。该属性的作用是动态分配assignee,其实在前面的文章中介绍过,这里就不详细描述了,有兴趣的可以参考JBPM具体应用之EL表达式动态分配assignee这篇文章。

3.task节点的swimlane属性。在现实中,很可能有这种情况存在:首先由A执行任务task1,然后由B执行task2,然后再由A执行task3,我们可以看到task1和task3的执行人都是A,在这种情况下采用swimLane属性,我们就不必在task1和task3中分别指定assignee了。具体的jpdl文件如下:

<?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="290,1,48,48">
      <transition name="提交到任务A" to="任务A" g="-52,-20"/>
   </start>
   <end name="end1" g="309,338,48,48"/>
   <task swimlane="mySwim" name="任务A" g="272,84,92,52">
      <transition name="提交到任务B" to="任务B" g="-52,-20"/>
   </task>
   <task assignee="U2" name="任务B" g="278,171,92,52">
      <transition name="提交到任务C" to="任务C" g="-52,-20"/>
   </task>
   <task swimlane="mySwim" name="任务C" g="286,255,92,52">
      <transition name="通过" to="end1" g="-50,-20"/>
   </task>
</process>
从上面的jpdl配置中我们可以看到,首先有一个swimLane标签,这就是我们所建的名为“mySwim”的泳道,在“任务A”和“任务C”中都存在swimLane属性,其值都为 “mySwim”,这表明这两个人都在泳道mySwim中,也就是说这两个任务的执行人为同一个人。


评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值