`
suhuanzheng7784877
  • 浏览: 691040 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47208
社区版块
存档分类
最新评论

JBPM4学习总结之4——Decision(判断活动)

    博客分类:
  • jbpm
阅读更多

下面咱们来看看正宗的做条件判断的流程是如何工作的。

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.       decisionexpr属性决定流向

decisionexpr属性和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);

StateDecision都可以决定分支的流向,他们的区别就是:1.如果Decision活动没有得到条件的满足,那么流程进行不下去,会发生异常;2.如果State下面的多个活动没有达到满足则默认会走向第一个分支,让整个流程继续走下去。从而可以看出DecisionState具有更加严格的条件判断性。
  • 大小: 15.3 KB
  • 大小: 13.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics