JBPM4.4开发(二)-------------决策节点decision

来源:互联网 发布:好听的淘宝收件人名字 编辑:程序博客网 时间:2024/06/07 03:05

decision

decision活动会运行并判断其中的每一个transition元素里的转移条件。当遇到一个transition的condition为true时,那么流程立即流向这个transition。流程引擎不会等待decision活动,它会马上执行这个decision。

expr属性:用一个三目运算符来判断到底要流向拿个transition。

transition元素的condition子元素:用expr来判断是否流向这个transition。

decision活动的handler子元素:如果以上两种方法还是不能满足我们的要求,就可以通过实现DecisionHandler接口来在Java代码中决定到底要流向哪个transition。

1.条件

决策节点会顺序执行并判断每一个transition里的条件。当遇到一个条件为true或者没有设置判断条件的transition时,这个transition就会被执行。

demo如下:

decision01.jpdl.xml

<?xml version="1.0" encoding="UTF-8"?><process name="decision01" xmlns="http://jbpm.org/4.4/jpdl">   <start g="20,135,48,48" name="start1">      <transition g="-42,-14" name="to exclusive1" to="exclusive1"/>   </start>   <decision g="130,134,48,48" name="exclusive1">      <transition g="154,83:24,-16" name="to readbook" to="readbook">      <condition expr="#{reason == 'work'}"></condition>      </transition>      <transition g="-40,-14" name="to watchgames" to="watchgames">      <condition expr="#{reason == 'football'}"></condition>      </transition>      <transition g="156,246:41,-14" name="to sleep" to="sleep"/>   </decision>   <state g="282,56,92,52" name="readbook"/>   <state g="280,135,92,52" name="watchgames"/>   <state g="284,218,92,52" name="sleep"/></process>

测试代码如下:

package com.itstudio.jbpm.decision.demo;import java.util.HashMap;import java.util.Map;import javax.rmi.PortableRemoteObject;import org.jbpm.api.Configuration;import org.jbpm.api.ExecutionService;import org.jbpm.api.HistoryService;import org.jbpm.api.ProcessEngine;import org.jbpm.api.ProcessInstance;import org.jbpm.api.RepositoryService;import org.jbpm.api.TaskService;public class TestDecisionDemo01 {public static final Configuration configuration = new Configuration();public static final ProcessEngine processEngine=configuration.buildProcessEngine();public static final RepositoryService repositoryService= processEngine.getRepositoryService();public static final ExecutionService executionService=processEngine.getExecutionService();/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubTestDecisionDemo01 t = new TestDecisionDemo01();t.deploy();t.test();}public void deploy(){repositoryService.createDeployment().addResourceFromClasspath("com/itstudio/jbpm/decision/demo/decision01.jpdl.xml").deploy();System.out.println("发布成功!");}public void test(){Map<String , Object> map = new HashMap<String , Object>();map.put("reason", "work");ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision01",map);System.out.println("流程实例ID---->"+processInstance.getId());System.out.println("流程定义ID---->"+processInstance.getProcessDefinitionId());ProcessInstance instance = executionService.signalExecutionById(processInstance.getId());System.out.println("是否位于readbook节点----->"+instance.isActive("readbook"));System.out.println("是否位于watchgames节点----->"+instance.isActive("watchgames"));System.out.println("是否位于sleep节点----->"+instance.isActive("sleep"));System.out.println("流程是否结束------>"+instance.isEnded());}}

运行结果:

 

2.表达式



 decision02.jpdl.xml 如下:

<?xml version="1.0" encoding="UTF-8"?><process name="decision02" xmlns="http://jbpm.org/4.4/jpdl">   <start name="start1" g="7,161,48,48">      <transition name="to exclusive1" to="exclusive1" g="-42,-14"/>   </start>   <decision name="exclusive1" g="134,161,48,48" expr="#{reason}">      <transition name="to readbook" to="readbook" g="158,109:17,-19"/>      <transition name="to watchgames" to="watchgames" g="-41,-16"/>      <transition name="to sleep" to="sleep" g="158,262:31,-21"/>   </decision>   <state name="readbook" g="280,81,92,52"/>   <state name="watchgames" g="273,161,92,52"/>   <state name="sleep" g="279,235,92,52"/></process>

测试类:TestDecisionDemo02

package com.itstudio.jbpm.decision.demo;import java.util.HashMap;import java.util.Map;import org.jbpm.api.Configuration;import org.jbpm.api.ExecutionService;import org.jbpm.api.ProcessEngine;import org.jbpm.api.ProcessInstance;import org.jbpm.api.RepositoryService;public class TestDecisionDemo02 {public static final Configuration configuration = new Configuration();public static final ProcessEngine processEngine=configuration.buildProcessEngine();public static final RepositoryService repositoryService= processEngine.getRepositoryService();public static final ExecutionService executionService=processEngine.getExecutionService();/** * @param args */public void deploy(){repositoryService.createDeployment().addResourceFromClasspath("com/itstudio/jbpm/decision/demo/decision02.jpdl.xml").deploy();System.out.println("发布成功!");}public void test(){Map<String , Object> map = new HashMap<String , Object>();map.put("reason", "to watchgames");ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision02",map);System.out.println("流程实例ID---->"+processInstance.getId());System.out.println("流程定义ID---->"+processInstance.getProcessDefinitionId());ProcessInstance instance = executionService.signalExecutionById(processInstance.getId());System.out.println("是否位于readbook节点----->"+instance.isActive("readbook"));System.out.println("是否位于watchgames节点----->"+instance.isActive("watchgames"));System.out.println("是否位于sleep节点----->"+instance.isActive("sleep"));System.out.println("流程是否结束------>"+instance.isEnded());}public static void main(String[] args) {// TODO Auto-generated method stubTestDecisionDemo02 demo2 = new TestDecisionDemo02();demo2.deploy();demo2.test();}}


运行结果如下图:


 

 3. 决策处理器

decision03.jpdl.xml 如下:

<?xml version="1.0" encoding="UTF-8"?><process name="decision03" xmlns="http://jbpm.org/4.4/jpdl">   <start name="start1" g="45,146,48,48">      <transition name="to exclusive1" to="exclusive1" g="-43,-19"/>   </start>   <decision name="exclusive1" g="164,144,48,48">     <handler class="com.itstudio.jbpm.decision.demo.Decision03HandlerTest"></handler>      <transition name="to readbook" to="readbook" g="187,99:2,-14"/>      <transition name="to watchgames" to="watchgames" g="-50,-17"/>      <transition name="to sleep" to="sleep" g="189,235:26,-16"/>   </decision>   <state name="readbook" g="314,75,92,52"/>   <state name="watchgames" g="316,140,92,52"/>   <state name="sleep" g="314,212,92,52"/></process>


决策处理类Decision03HandlerTes  如下:

package com.itstudio.jbpm.decision.demo;import org.jbpm.api.jpdl.DecisionHandler;import org.jbpm.api.model.OpenExecution;public class Decision03HandlerTest implements DecisionHandler {@Overridepublic String decide(OpenExecution execution) {// TODO Auto-generated method stubString reason = (String) execution.getVariable("reason");if(reason.equals("work")){return "to readbook";}else if(reason.equals("have a game")){return "to watchgames";}else{return "to sleep";}}}

测试类TestDecisionDemo03 如下:

package com.itstudio.jbpm.decision.demo;import java.util.HashMap;import java.util.Map;import org.jbpm.api.Configuration;import org.jbpm.api.ExecutionService;import org.jbpm.api.ProcessEngine;import org.jbpm.api.ProcessInstance;import org.jbpm.api.RepositoryService;public class TestDecisionDemo03 {public static final Configuration configuration = new Configuration();public static final ProcessEngine processEngine=configuration.buildProcessEngine();public static final RepositoryService repositoryService= processEngine.getRepositoryService();public static final ExecutionService executionService=processEngine.getExecutionService();public void deploy(){repositoryService.createDeployment().addResourceFromClasspath("com/itstudio/jbpm/decision/demo/decision03.jpdl.xml").deploy();System.out.println("发布成功!");}/** * @param args */public void test(){Map<String , Object> map = new HashMap<String , Object>();map.put("reason", "have a game");ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision03",map);System.out.println("流程实例ID---->"+processInstance.getId());System.out.println("流程定义ID---->"+processInstance.getProcessDefinitionId());ProcessInstance instance = executionService.signalExecutionById(processInstance.getId());System.out.println("是否位于readbook节点----->"+instance.isActive("readbook"));System.out.println("是否位于watchgames节点----->"+instance.isActive("watchgames"));System.out.println("是否位于sleep节点----->"+instance.isActive("sleep"));System.out.println("流程是否结束------>"+instance.isEnded());}public static void main(String[] args) {// TODO Auto-generated method stubTestDecisionDemo03 demo = new TestDecisionDemo03();demo.deploy();demo.test();}}


运行结果:

By Mr.Z

原创粉丝点击