jbpm学习五

来源:互联网 发布:淘宝司法拍卖车辆过户 编辑:程序博客网 时间:2024/05/16 09:17
4.decision节点(判断节点):
主要用于程序判断分流,循环,在jpdl中有两种用法:
第一种用法:基于expr表达式判断
<?xml version="1.0" encoding="UTF-8"?><process name="demo4_decision1" xmlns="http://jbpm.org/4.4/jpdl">   <start name="start1" g="235,12,48,48">      <transition name="to 逛故宫" to="逛故宫" g="-59,-17"/>   </start>   <end name="end1" g="247,322,48,48"/>   <task name="逛故宫" g="223,75,92,52">      <transition name="to exclusive1" to="exclusive1" g="-83,-17"/>   </task>   <!-- JBPM juel表达式 -->   <decision name="exclusive1" g="241,148,48,48">      <transition name="to 学生半票" to="学生半票" g="-71,-17">      <!-- user代表JBPM流程变量 -->      <condition expr="#{user=='学生'}"/>      </transition>      <transition name="to 老年人和军人免费" to="老年人和军人免费" g="-119,-17">      <condition expr="#{user=='老年人'||user=='军人'}"/>      </transition>      <!-- 不写条件,前面条件都不满足,执行这个transition -->      <transition name="to 普通人正常售票" to="普通人正常售票" g="-107,-17">      </transition>   </decision>   <task name="学生半票" g="81,213,92,52">      <transition name="to end1" to="end1" g="-47,-17"/>   </task>   <task name="老年人和军人免费" g="223,226,120,52">      <transition name="to end1" to="end1" g="-47,-17"/>   </task>   <task name="普通人正常售票" g="379,214,130,54">      <transition name="to end1" to="end1" g="-47,-17"/>   </task></process>


以上是流程图和该流程图对应的xml配置文件,当从‘逛故宫’节点向下走到name=‘exclusivel’这层节点时,出现了desition判断,会进入满足condition条件判断的节点,

如果都不满足,则进入没有配置condition条件的节点(例如上面,当条件既不满足‘学生’也不满足‘老人’或者‘军人’时,就会进入没有配置condition的‘普通人正常售票’节点),如果所有的节点都配置了condition条件,但是都不满足,程序报错。
流程发布,启动我不必多说,启动后jbpm4_task表中如下图所示:


执行下面代码,使其向后流转
@Test// 逛故宫public void demo3() {// 1、 获得流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、获得ServiceTaskService taskService = processEngine.getTaskService();// 3、保存变量HashMap<String, Object> variables = new HashMap<String, Object>();variables.put("user", "军人");taskService.setVariables("10002", variables);// 完成任务taskService.completeTask("10002");}
可以看到,我向user中传入的是‘军人’,所以应该向后流转到‘老人和军人免费’节点,此时jbpm4_task表中记录如下所示:

第二种用法:基于代码DecisionHandlar判断
同上面相同的流程,第二种用法流程图xml配置文件如下所示:
<?xml version="1.0" encoding="UTF-8"?><process name="demo4_decision2" xmlns="http://jbpm.org/4.4/jpdl">   <start g="235,12,48,48" name="start1">      <transition g="-59,-17" name="to 逛故宫" to="逛故宫"/>   </start>   <end g="247,322,48,48" name="end1"/>   <task g="223,75,92,52" name="逛故宫">      <transition g="-83,-17" name="to exclusive1" to="exclusive1"/>   </task>   <!-- 基于程序控制 判断 -->   <decision g="241,148,48,48" name="exclusive1">     <handler class="learn.MyDecisionHandler"/>      <transition g="-71,-17" name="to 学生半票" to="学生半票" />      <transition g="-119,-17" name="to 老年人和军人免费" to="老年人和军人免费" />      <transition g="-107,-17" name="to 普通人正常售票" to="普通人正常售票" />   </decision>   <task g="81,213,92,52" name="学生半票">      <transition g="-47,-17" name="to end1" to="end1"/>   </task>   <task g="223,226,120,52" name="老年人和军人免费">      <transition g="-47,-17" name="to end1" to="end1"/>   </task>   <task g="386,216,130,54" name="普通人正常售票">      <transition g="-47,-17" name="to end1" to="end1"/>   </task></process>
可以看到同第一种不同的是,decision判断节点的条件没有分别判断,而是通过learn.MyDecisionHandler这个类来获得后分别对应到下面不同的节点上。
import org.jbpm.api.jpdl.DecisionHandler;import org.jbpm.api.model.OpenExecution;/** * 作为判断执行代码,必须实现DesicionHandler接口 *  * @author seawind *  */public class MyDecisionHandler implements DecisionHandler {@Overridepublic String decide(OpenExecution openExecution) {// openExecution 用于获取流程变量String user = (String) openExecution.getVariable("user");if ("学生".equals(user)) {return "to 学生半票"; // 返回transition节点name属性} else if ("老年人".equals(user) || "军人".equals(user)) {return "to 老年人和军人免费";} else {return "to 普通人正常售票";}}}
向后流转执行代码和第一种方式一样,只不过配置文件从MyDecisionHandler这个类中取得handler条件,在分别判断节点是否符合条件。
一般来说,Handler写法比较灵活,expr写法比较简单。







0 0
原创粉丝点击