在上一篇文章中我们介绍了decision节点的使用,在本文我们将介绍fork,join和state节点。
1.fork和join这两个节点总是成对出现的,有分叉必然有合并。他们所起的作用为有多个任务必须全部完成才能进入到下一个任务中。也就是说fork标签中的全部transition全部完成后才能进入到join标签中的transition。具体的jpdl文件如下:
<?xml version="1.0" encoding="UTF-8"?> <process name="fork" key="fork" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start1" g="28,171,48,48"> <transition name="to fork1" to="fork1" g="-52,-20"/> </start> <fork name="fork1" g="127,169,48,48"> <transition name="to A" to="A" g="-29,-20"/> <transition name="to B" to=" B" g="-33,-20"/> <transition name="to C" to="C" g="-29,-20"/> </fork> <task assignee="userA" name="A" g="245,84,92,52"> <transition name="to join1" to="join1" g="-49,-20"/> </task> <task assignee="userB" name=" B" g="254,172,92,52"> <transition name="to join1" to="join1" g="-49,-20"/> </task> <task assignee="userC" name="C" g="255,261,92,52"> <transition name="to join1" to="join1" g="-49,-20"/> </task> <join name="join1" g="447,171,48,48"> <transition name="to task4" to="合并" g="-52,-20"/> </join> <task assignee="userM" name="合并" g="545,172,92,52"> <transition name="to end1" to="end1" g="-50,-20"/> </task> <end name="end1" g="702,170,48,48"/> </process>使用fork与单个task的不同之处其实仅在task的数目,fork中的每个transition其实指向的是另外一个task,并且fork中transition指向的task并没有顺序之分,各个任务的地位是平等的。下面我将结合java后台代码来印证fork和join:
public class TestFork extends JbpmTestCase implements JbpmUtil { @Override public void deploy() { super.startUp(); repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/fork/fork.jpdl.xml").deploy(); } @Override public void createInstance() { super.startUp(); ProcessInstance processInstance = executionService.startProcessInstanceByKey("fork"); print("流程实例ID",processInstance.getId()); } @Override public void getCurrentActivity() { super.startUp(); String name = executionService.createProcessInstanceQuery().processInstanceId("fork.10001").uniqueResult().findActiveActivityNames().toString(); print("当前节点",name); } @Override public void getTask() { super.startUp(); List<Task> tasks = taskService.findPersonalTasks("userB"); print("任务节点名词",tasks.get(0).getActivityName()); print("任务节点ID",tasks.get(0).getId()); } @Override public void completeTask() { super.startUp(); taskService.completeTask("20001"); } }
2.state节点的使用。state的使用十分的简单,它是task的简化版,从其中文意思“状态”可知,它所起的作用只不过是一个状态标识。说白了就是记录状态的转变。其jpdl文件如下:
<?xml version="1.0" encoding="UTF-8"?> <process key="state" name="state" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start1" g="311,14,48,48"> <transition name="提交到A" to="节点A" g="-56,-20"/> </start> <end name="end1" g="326,362,48,48"/> <state name="节点A" g="297,83,92,52"> <transition name="提交到B" to="节点B" g="-56,-20"/> </state> <state name="节点B" g="303,161,92,52"> <transition name="提交到C" to="节点C" g="-56,-20"/> </state> <state name="节点C" g="307,256,92,52"> <transition name="通过" to="end1" g="-50,-20"/> </state> </process>那么state节点具体,比如一个文件有四个状态分别是“未提交”,“已提交”,“待审”,“已审”,除了状态的改变之外没有任何其他的操作,这时我们就可以考虑使用state节点,其使用方式十分的简单如下:
public class TestState extends JbpmTestCase implements JbpmUtil { @Override public void deploy() { super.startUp(); repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/state/state.jpdl.xml").deploy(); } @Override public void createInstance() { super.startUp(); ProcessInstance processInstance = executionService.startProcessInstanceByKey("state"); print("流程实例ID",processInstance.getId()); } @Override public void getCurrentActivity() { super.startUp(); String name = executionService.createProcessInstanceQuery().processInstanceId("state.20001").uniqueResult().findActiveActivityNames().toString(); print("流程当前节点",name); } @Override public void changeState() { super.startUp(); executionService.signalExecutionById("state.210001"); } }
原文:http://blog.csdn.net/a1314517love/article/details/19011303