JBPM4学习总结之4——Decision(判断活动)
下面咱们来看看正宗的做条件判断的流程是如何工作的。
1. transition下面的condition属性决定流向
流程图如下
Xml描述如下:
<?xml version="1.0" encoding="UTF-8"?>
<process name="decision" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start1" g="200,38,48,48"> <transition name="to exclusive1" to="exclusive1" g="-79,-22" /> </start> <decision name="exclusive1" g="204,141,91,48"> <transition name="accecpt" to="ok" g="67,164:-56,-22"> <condition expr="#{con=='good'}" /> </transition> <transition name="refect" to="refect" g="-56,-22"> <condition expr="#{con=='bad'}" /> </transition> <transition name="toend" to="toend" g="417,167:-56,-22" /> </decision> <state name="ok" g="25,236,92,52" /> <state name="refect" g="190,252,92,52" /> <state name="toend" g="358,241,92,52" /> </process> |
可以看出每一个transition通过condition中的EL表达式来决定应该转向哪个分支。
测试代码如下:
// 判断条件 Map<String, Object> con = new HashMap<String, Object>();
con.put("con", "bad");
// 开始process流程 ProcessInstance processInstance = executionService .startProcessInstanceByKey("decision", con);
// 流程实例的ID String pid = processInstance.getId();
System.out.println(pid);
boolean isAction = processInstance.isActive("refect");
System.out.println(isAction); |
这样通过流程变量“con”来决定流程实例未来的走向。上个代码将流程走到了refect节点。
1. decision的expr属性决定流向
decision的expr属性和transition下面的condition差不多,无非是少定义几行代码。如下:
<decision expr=”#{con}” name=”start”> |
测试代码和上面一样,结果亦同。
2. 单独的Java类决定流向
单独使用Java类来处理复杂流程的流向,则该处理类必须实现DecisionHandler接口(org.jbpm.api.jpdl.DecisionHandler)。
先看流程:
大致和第一个差不多
流程xml定义如下:
<?xml version="1.0" encoding="UTF-8"?>
<process name="decisionHandler" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start1" g="201,40,48,48"> <transition name="to exclusive1" to="exclusive1" g="-79,-22" /> </start> <state name="ok" g="26,234,92,52" /> <state name="delete" g="181,244,92,52" /> <state name="end" g="350,230,92,52" /> <decision name="exclusive1" g="200,133,48,48"> <handler class="myHandler.MyDecisionHandler" /> <transition name="took" to="ok" g="73,159:-56,-22" /> <transition name="todelete" to="delete" g="-56,-22" /> <transition name="toend" to="end" g="396,159:-56,-22" /> </decision> </process> |
在流程定义中加入了一个流程处理类MyDecisionHandler,自己实现decide方法。
该类代码如下:
package myHandler;
import org.jbpm.api.jpdl.DecisionHandler; import org.jbpm.api.model.OpenExecution;
import vo.DesicionVO;
public class MyDecisionHandler implements DecisionHandler {
/** * */ private static final long serialVersionUID = -8252198085094966729L;
@Override public String decide(OpenExecution arg) {
DesicionVO desicionVO = (DesicionVO) arg.getVariable("con");
if ("took".equals(desicionVO.getName())) { return "took"; } else if ("todelete".equals(desicionVO.getName())) { return "todelete"; }
return "toend"; }
}
|
根据流程实例变量DesicionVO中的数值来决定流程转向哪里。
测试代码如下:
//判断条件 Map<String,Object> con = new HashMap<String,Object>();
DesicionVO desicionVO = new DesicionVO(); desicionVO.setName("took");
con.put("con", desicionVO);
// 开始process流程 ProcessInstance processInstance = executionService .startProcessInstanceByKey("decisionHandler",con);
// 流程实例的ID String pid = processInstance.getId();
System.out.println(pid);
boolean isAction = processInstance.isActive("ok");
System.out.println(isAction); |