JBPM具体应用之task节点的使用
- - CSDN博客综合推荐文章task节点是最常用的节点之一,也因为执行任务的情况有很多种,所以他的用法也是多种多样的,本文主要讲解task的三种用法分别如下:. 1.candidate属性. 该熟属性在于task节点中,他的作用类似于组内工作分配,假如一个组内有两个人a1和a2,将该属性所在任务分配给两人中的一个后,则只有该任务被分配人才能看到任务,其他人都看不到.
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>
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中,也就是说这两个任务的执行人为同一个人。