Quantcast
Channel: IT社区推荐资讯 - ITIndex.net
Viewing all articles
Browse latest Browse all 15843

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

$
0
0

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中,也就是说这两个任务的执行人为同一个人。


作者:a1314517love 发表于2014-2-9 21:14:03 原文链接
阅读:50 评论:0 查看评论

Viewing all articles
Browse latest Browse all 15843

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>