JBPM工作流引擎为我们提供了许多的节点应用,每一个节点都有其不同的作用,其中有四个比较常用的节点,他们分别decision,fork,state和task。在本文中我们先介绍decision节点,余下的节点在下文介绍。
decision节点,顾名思义是一个判断节点,通过判断条件来决定执行哪项任务,decision节点的使用方式又分为三种,他们依次是:
(1)handler方式:使用handler标签将具体的执行方向交给java类来决定,jpdl文件如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <process key="decision2" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
- <start name="start1" g="43,136,48,48">
- <transition name="提交" to="exclusive1" g="-14,-25"/>
- </start>
- <decision name="exclusive1" g="153,137,48,48">
- <handler class="com.tgb.node.decision.MyDecision"/>
- <transition name="到组长" to="组长" g="-52,-20">
- </transition>
- <transition name="到科长" to="科长" g="-52,-20">
- </transition>
- <transition name="到主任" to="主任" g="-52,-20">
- </transition>
- </decision>
- <task assignee="zuzhang" name="组长" g="323,40,92,52">
- <transition name="组长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="kezhang" name="科长" g="333,135,92,52">
- <transition name="科长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="zhuren" name="主任" g="336,233,92,52">
- <transition name="主任批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="caiwu" name="归档" g="579,133,92,52">
- <transition name="通过" to="end1" g="-29,-23"/>
- </task>
- <end name="end1" g="749,141,48,48"/>
- </process>
- public class MyDecision implements DecisionHandler {
- private static final long serialVersionUID = 1L;
- @Override
- public String decide(OpenExecution execution) {
- String to = execution.getVariable("to").toString();
- if(to.equals("组长")){
- return "到组长";
- }else if(to.equals("科长")){
- return "到科长";
- }else{
- return "到主任";
- }
- }
- }
- public class TestDecision extends JbpmTestCase implements JbpmUtil {
- @Override
- public void deploy() {
- super.startUp();
- repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/decision/decision2.jpdl.xml").deploy();
- }
- @Override
- public void createInstance() {
- super.startUp();
- Map<String,Object> map = new HashMap<String,Object>();
- map.put("to", "组长");
- ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision2", map);
- print("流程实例ID",processInstance.getId());
- }
- @Override
- public void getCurrentActivity() {
- super.startUp();
- String name = executionService.createProcessInstanceQuery().processInstanceId("decision.20001").uniqueResult().findActiveActivityNames().toString();
- print("到达节点名词",name);
- }
- }
(2)EL表达式进行判断。个人建议使用这种首先来看jpdl文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
- <start name="start1" g="43,136,48,48">
- <transition name="提交" to="exclusive1" g="-14,-25"/>
- </start>
- <decision name="exclusive1" expr="${node}" g="153,137,48,48">
- <transition name="小于2天" to="组长" g="-52,-20"/>
- <transition name="大于2天,小于10" to="科长" g="-52,-20"/>
- <transition name="10天以上" to="主任" g="-52,-20"/>
- </decision>
- <task assignee="zuzhang" name="组长" g="323,40,92,52">
- <transition name="组长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="kezhang" name="科长" g="333,135,92,52">
- <transition name="科长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="zhuren" name="主任" g="336,233,92,52">
- <transition name="主任批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="caiwu" name="归档" g="579,133,92,52">
- <transition name="通过" to="end1" g="-29,-23"/>
- </task>
- <end name="end1" g="749,141,48,48"/>
- </process>
使用EL表达式省去了第三方类进行判断的麻烦,我们直接将判断条件写在java代码中进行判断,后台代码如下:
- public class TestDecision extends JbpmTestCase implements JbpmUtil {
- @Override
- public void deploy() {
- super.startUp();
- repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/decision/decision.jpdl.xml").deploy();
- }
- @Override
- public void createInstance() {
- super.startUp();
- Map<String,Object> map = new HashMap<String,Object>();
- map.put("node", "小于2天");
- ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision", map);
- print("流程实例ID",processInstance.getId());
- }
- @Override
- public void getCurrentActivity() {
- super.startUp();
- String name = executionService.createProcessInstanceQuery().processInstanceId("decision.20001").uniqueResult().findActiveActivityNames().toString();
- print("到达节点名词",name);
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <process key="decision1" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
- <start name="start1" g="43,136,48,48">
- <transition name="提交" to="exclusive1" g="-14,-25"/>
- </start>
- <decision name="exclusive1" g="153,137,48,48">
- <transition name="小于2天" to="组长" g="-52,-20">
- <condition expr="${days lt 2}"/>
- </transition>
- <transition name="大于2天,小于10" to="科长" g="-52,-20">
- <condition expr="${days ge 2 and days le 10}"/>
- </transition>
- <transition name="10天以上" to="主任" g="-52,-20">
- <condition expr="${days gt 10}"/>
- </transition>
- </decision>
- <task assignee="zuzhang" name="组长" g="323,40,92,52">
- <transition name="组长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="kezhang" name="科长" g="333,135,92,52">
- <transition name="科长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="zhuren" name="主任" g="336,233,92,52">
- <transition name="主任批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="caiwu" name="归档" g="579,133,92,52">
- <transition name="通过" to="end1" g="-29,-23"/>
- </task>
- <end name="end1" g="749,141,48,48"/>
- </process>
- public class TestDecision extends JbpmTestCase implements JbpmUtil {
- @Override
- public void deploy() {
- super.startUp();
- repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/decision/decision1.jpdl.xml").deploy();
- }
- @Override
- public void createInstance() {
- super.startUp();
- Map<String,Object> map = new HashMap<String,Object>();
- map.put("days", 1);
- ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision1", map);
- print("流程实例ID",processInstance.getId());
- }
- @Override
- public void getCurrentActivity() {
- super.startUp();
- String name = executionService.createProcessInstanceQuery().processInstanceId("decision.20001").uniqueResult().findActiveActivityNames().toString();
- print("到达节点名词",name);
- }
- }