jbpm系列之五--使用decision节点判断分支情况
2013-06-26 19:56
375 查看
我们在用JBPM做流程的时候,很多时候会遇到需要判断的节点。类似java中的switch,根据不同的状态,跳转到不同的节点。
首先我们定义一个流程信息,jpdl流程图如下
明显的可以看到,在此种情况下我们就必须用到decision节点来控制不同的业务跳转到不同的角色上。
我们的jpdl.xml中的代码为:
此种方法是定义流程变量,流程变量等于transition中的哪个name的值就跳转到哪个角色中
在代码中:
我们只需在代码中控制node的值即可跳转到不同的人员。
第二种:使用表达式判断
此种方法即把判断放到配置文件中,只需传过一个数字来判断即可。
创建流程实例代码如上,将参数用days传过来即可判断。
第三种方法:监听判断
写一个类MyDecision,继承DecisionHandler
在jpdl文件中配置上MyDecision,通过复写decide方法,用execution将参数传过来。
MyDecision类中代码:
此种方法将判断逻辑交给了java代码,不用重新部署流程。
首先我们定义一个流程信息,jpdl流程图如下
明显的可以看到,在此种情况下我们就必须用到decision节点来控制不同的业务跳转到不同的角色上。
我们的jpdl.xml中的代码为:
<?xml version="1.0" encoding="UTF-8"?> <process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start1" g="22,200,48,48"> <transition name="提交" to="exclusive1" g="-15,-20"/> </start> <decision name="exclusive1" expr="${node}" g="185,201,48,48"> <transition name="小于2天" to="组长" g="-49,-32"/> <transition name="大于2天,小于10" to="科长" g="-56,-28"/> <transition name="10天以上" to="主任" g="-47,-22"/> </decision> <task assignee="zuzhang" name="组长" g="338,69,92,52"> <transition name="组长批准" to="归档" g="-51,-26"/> </task> <task assignee="kezhang" name="科长" g="342,199,92,52"> <transition name="科长批准" to="归档" g="-49,-25"/> </task> <task assignee="zhuren" name="主任" g="349,325,92,52"> <transition name="主任批准" to="归档" g="-41,-25"/> </task> <task assignee="caiwu" name="归档" g="531,201,92,52"> <transition name="通过" to="end1" g="-35,-22"/> </task> <end name="end1" g="689,208,48,48"/> </process>
此种方法是定义流程变量,流程变量等于transition中的哪个name的值就跳转到哪个角色中
在代码中:
package com.tgb.node.decision; import java.util.HashMap; import java.util.Map; import org.jbpm.api.ProcessInstance; import com.tgb.video.JbpmTestCase; import com.tgb.video.JbpmUtil; 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天,小于10"); ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision", map); print("流程实例ID",processInstance.getId()); } @Override public void getCurrectActivity() { super.startUp(); String name = executionService.createProcessInstanceQuery().processInstanceId("decision.130001").uniqueResult().findActiveActivityNames().toString(); print("到达节点名称",name); } @Override public void getTask() { // TODO Auto-generated method stub } @Override public void completeTask() { // TODO Auto-generated method stub } }
我们只需在代码中控制node的值即可跳转到不同的人员。
第二种:使用表达式判断
<?xml version="1.0" encoding="UTF-8"?> <process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start1" g="22,200,48,48"> <transition name="提交" to="exclusive1" g="-15,-20"/> </start> <decision name="exclusive1" g="185,201,48,48"> <transition name="小于2天" to="组长" g="-49,-32"> <condition expr="${days lt 2}"/> </transition> <transition name="大于2天,小于10" to="科长" g="-56,-28"> <condition expr="${days ge 2 and days le 10}"/> </transition> <transition name="10天以上" to="主任" g="-47,-22"> <condition expr="${days gt 10}"/> </transition> </decision> <task assignee="zuzhang" name="组长" g="338,69,92,52"> <transition name="组长批准" to="归档" g="-51,-26"/> </task> <task assignee="kezhang" name="科长" g="342,199,92,52"> <transition name="科长批准" to="归档" g="-49,-25"/> </task> <task assignee="zhuren" name="主任" g="349,325,92,52"> <transition name="主任批准" to="归档" g="-41,-25"/> </task> <task assignee="caiwu" name="归档" g="531,201,92,52"> <transition name="通过" to="end1" g="-35,-22"/> </task> <end name="end1" g="689,208,48,48"/> </process>
此种方法即把判断放到配置文件中,只需传过一个数字来判断即可。
public void createInstance() { super.startUp(); Map<String,Object> map = new HashMap<String,Object>(); map.put("days", 15); ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision", map); print("流程实例ID",processInstance.getId()); }
创建流程实例代码如上,将参数用days传过来即可判断。
第三种方法:监听判断
写一个类MyDecision,继承DecisionHandler
在jpdl文件中配置上MyDecision,通过复写decide方法,用execution将参数传过来。
<?xml version="1.0" encoding="UTF-8"?> <process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start1" g="22,200,48,48"> <transition name="提交" to="exclusive1" g="-15,-20"/> </start> <decision name="exclusive1" g="185,201,48,48"> <handler class="com.tgb.node.decision.MyDecision"/> <transition name="到组长" to="组长" g="-49,-32"> </transition> <transition name="到科长" to="科长" g="-56,-28"> </transition> <transition name="到主任" to="主任" g="-47,-22"> </transition> </decision> <task assignee="zuzhang" name="组长" g="338,69,92,52"> <transition name="组长批准" to="归档" g="-51,-26"/> </task> <task assignee="kezhang" name="科长" g="342,199,92,52"> <transition name="科长批准" to="归档" g="-49,-25"/> </task> <task assignee="zhuren" name="主任" g="349,325,92,52"> <transition name="主任批准" to="归档" g="-41,-25"/> </task> <task assignee="caiwu" name="归档" g="531,201,92,52"> <transition name="通过" to="end1" g="-35,-22"/> </task> <end name="end1" g="689,208,48,48"/> </process>
MyDecision类中代码:
package com.tgb.node.decision; import org.jbpm.api.jpdl.DecisionHandler; import org.jbpm.api.model.OpenExecution; 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.endsWith("科长")){ return "到科长"; }else{ return "到主任"; } } }
此种方法将判断逻辑交给了java代码,不用重新部署流程。
相关文章推荐
- jbpm系列之五--使用decision节点判断分支情况
- jbpm分支decision节点判断跳转
- JBPM具体应用之decision节点的使用
- JBPM具体应用之decision节点的使用
- JBPM具体应用之decision节点的使用
- 安卓BroadcastReceiver组件使用系列3:使用广播来判断数据网络和无线网络的连接情况
- JBPM具体应用之decision节点的使用
- jBPM Decision中使用Expression来进行流程分支选择
- Silverlight实用窍门系列:45.Silverlight下使用WinDbg调试应用程序和查看异常情况
- dedecms下dede:sql及默认情况下使用if判断的方法
- 不开index monitor的情况下判断索引是否被使用过
- ztree组件使用--判断选中节点的根节点
- java使用Cookie判断用户登录情况
- 【转】IOS性能调优系列:使用Allocation动态分析内存使用情况
- Linux基础系列之判断符在shell中的使用方式
- JBoss 系列八十: jBPM 6 中使用 jbpm-console 创建执行 BPM 流程 - I
- jbpm的例子之四 使用decision
- DEDE模板中如何使用if进行多分支判断
- .net中使用XPath语言在xml中判断是否存在节点值的方法