jbpm学习五

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、获得Service
TaskService 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 {


	@Override
	public 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写法比较简单。







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值