在上一篇文章中我们介绍了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");
}
}
当部署好流程并创建一个流程实例后执行getCurrentActivity()函数执行结果显示当前任务是[A,B,C],这种情况印证了fork中的任务是没有顺序之分的,当我们执行completeTask()函数完成A的任务后,再次执行 getCurrentActivity()函数,结果显示当前任务是[B,C],并不是进入到了“合并”任务,当将任务B和任务C全部结束后再次执行getCurrentActivity(),结果显示此时A,B,C任务全部完成后才进入到了“合并”任务。
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");
}
}
本文中我们介绍了fork,join,state三个节点,在下一篇文章中我将继续介绍最后一个也是最常用的一个节点task。