JBPM工作流引擎为我们提供了许多的节点应用,每一个节点都有其不同的作用,其中有四个比较常用的节点,他们分别decision,fork,state和task。在本文中我们先介绍decision节点,余下的节点在下文介绍。decision节点,顾名思义是一个判断节点,通过判断条件来决定执行哪项任务,decision节点的使用方式又分为三种,他们依次是:

(1)handler方式:使用handler标签将具体的执行方向交给java类来决定,jpdl文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <process key="decision2" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
  3. <start name="start1" g="43,136,48,48">
  4. <transition name="提交" to="exclusive1" g="-14,-25"/>
  5. </start>
  6. <decision name="exclusive1" g="153,137,48,48">
  7. <handler class="com.tgb.node.decision.MyDecision"/>
  8. <transition name="到组长" to="组长" g="-52,-20">
  9. </transition>
  10. <transition name="到科长" to="科长" g="-52,-20">
  11. </transition>
  12. <transition name="到主任" to="主任" g="-52,-20">
  13. </transition>
  14. </decision>
  15. <task assignee="zuzhang" name="组长" g="323,40,92,52">
  16. <transition name="组长批准" to="归档" g="-52,-20"/>
  17. </task>
  18. <task assignee="kezhang" name="科长" g="333,135,92,52">
  19. <transition name="科长批准" to="归档" g="-52,-20"/>
  20. </task>
  21. <task assignee="zhuren" name="主任" g="336,233,92,52">
  22. <transition name="主任批准" to="归档" g="-52,-20"/>
  23. </task>
  24. <task assignee="caiwu" name="归档" g="579,133,92,52">
  25. <transition name="通过" to="end1" g="-29,-23"/>
  26. </task>
  27. <end name="end1" g="749,141,48,48"/>
  28. </process>

在上面的jpdl文件中,我们可以看到当流程启动的时候具体执行那个task是由decision决定的,而decision又将判断权交给了MyDecision类,下面来看Decision类代码:

  1. public class MyDecision implements DecisionHandler {
  2. private static final long serialVersionUID = 1L;
  3. @Override
  4. public String decide(OpenExecution execution) {
  5. String to = execution.getVariable("to").toString();
  6. if(to.equals("组长")){
  7. return "到组长";
  8. }else if(to.equals("科长")){
  9. return "到科长";
  10. }else{
  11. return "到主任";
  12. }
  13. }
  14. }

这个Decision类是在什么时候做出的判断呢,非常简单的就可以想到,既然当创建流程实例的时候会自动进入到第一个任务节点,那么Decision类起判断作用的时刻毫无疑问应该是在创建流程实例的时候,下面我们就来看一下具体的创建过程:

  1. public class TestDecision extends JbpmTestCase implements JbpmUtil {
  2. @Override
  3. public void deploy() {
  4. super.startUp();
  5. repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/decision/decision2.jpdl.xml").deploy();
  6. }
  7. @Override
  8. public void createInstance() {
  9. super.startUp();
  10. Map<String,Object> map = new HashMap<String,Object>();
  11. map.put("to", "组长");
  12. ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision2", map);
  13. print("流程实例ID",processInstance.getId());
  14. }
  15. @Override
  16. public void getCurrentActivity() {
  17. super.startUp();
  18. String name = executionService.createProcessInstanceQuery().processInstanceId("decision.20001").uniqueResult().findActiveActivityNames().toString();
  19. print("到达节点名词",name);
  20. }
  21. }

在上面的代码中我们可以看到我们将判断条件放到了map中,在启动实例的时候将map中的条件取出放入到Decision类中进行判断。

(2)EL表达式进行判断。首先来看jpdl文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
  3. <start name="start1" g="43,136,48,48">
  4. <transition name="提交" to="exclusive1" g="-14,-25"/>
  5. </start>
  6. <decision name="exclusive1" expr="${node}" g="153,137,48,48">
  7. <transition name="小于2天" to="组长" g="-52,-20"/>
  8. <transition name="大于2天,小于10" to="科长" g="-52,-20"/>
  9. <transition name="10天以上" to="主任" g="-52,-20"/>
  10. </decision>
  11. <task assignee="zuzhang" name="组长" g="323,40,92,52">
  12. <transition name="组长批准" to="归档" g="-52,-20"/>
  13. </task>
  14. <task assignee="kezhang" name="科长" g="333,135,92,52">
  15. <transition name="科长批准" to="归档" g="-52,-20"/>
  16. </task>
  17. <task assignee="zhuren" name="主任" g="336,233,92,52">
  18. <transition name="主任批准" to="归档" g="-52,-20"/>
  19. </task>
  20. <task assignee="caiwu" name="归档" g="579,133,92,52">
  21. <transition name="通过" to="end1" g="-29,-23"/>
  22. </task>
  23. <end name="end1" g="749,141,48,48"/>
  24. </process>

使用EL表达式省去了第三方类进行判断的麻烦,我们直接将判断条件写在java代码中进行判断,后台代码如下:

  1. public class TestDecision extends JbpmTestCase implements JbpmUtil {
  2. @Override
  3. public void deploy() {
  4. super.startUp();
  5. repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/decision/decision.jpdl.xml").deploy();
  6. }
  7. @Override
  8. public void createInstance() {
  9. super.startUp();
  10. Map<String,Object> map = new HashMap<String,Object>();
  11. map.put("node", "小于2天");
  12. ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision", map);
  13. print("流程实例ID",processInstance.getId());
  14. }
  15. @Override
  16. public void getCurrentActivity() {
  17. super.startUp();
  18. String name = executionService.createProcessInstanceQuery().processInstanceId("decision.20001").uniqueResult().findActiveActivityNames().toString();
  19. print("到达节点名词",name);
  20. }
  21. }

(3)使用Condition标签,将判断条件写在EL表达式中进行判断。仍然先看jpdl文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <process key="decision1" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
  3. <start name="start1" g="43,136,48,48">
  4. <transition name="提交" to="exclusive1" g="-14,-25"/>
  5. </start>
  6. <decision name="exclusive1" g="153,137,48,48">
  7. <transition name="小于2天" to="组长" g="-52,-20">
  8. <condition expr="${days lt 2}"/>
  9. </transition>
  10. <transition name="大于2天,小于10" to="科长" g="-52,-20">
  11. <condition expr="${days ge 2 and days le 10}"/>
  12. </transition>
  13. <transition name="10天以上" to="主任" g="-52,-20">
  14. <condition expr="${days gt 10}"/>
  15. </transition>
  16. </decision>
  17. <task assignee="zuzhang" name="组长" g="323,40,92,52">
  18. <transition name="组长批准" to="归档" g="-52,-20"/>
  19. </task>
  20. <task assignee="kezhang" name="科长" g="333,135,92,52">
  21. <transition name="科长批准" to="归档" g="-52,-20"/>
  22. </task>
  23. <task assignee="zhuren" name="主任" g="336,233,92,52">
  24. <transition name="主任批准" to="归档" g="-52,-20"/>
  25. </task>
  26. <task assignee="caiwu" name="归档" g="579,133,92,52">
  27. <transition name="通过" to="end1" g="-29,-23"/>
  28. </task>
  29. <end name="end1" g="749,141,48,48"/>
  30. </process>

由于EL表达式具有的灵活性,我们可以在后台代码中仅传参数,而将具体的判断交给el表达式来完成,后台代码如下:

  1. public class TestDecision extends JbpmTestCase implements JbpmUtil {
  2. @Override
  3. public void deploy() {
  4. super.startUp();
  5. repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/decision/decision1.jpdl.xml").deploy();
  6. }
  7. @Override
  8. public void createInstance() {
  9. super.startUp();
  10. Map<String,Object> map = new HashMap<String,Object>();
  11. map.put("days", 1);
  12. ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision1", map);
  13. print("流程实例ID",processInstance.getId());
  14. }
  15. @Override
  16. public void getCurrentActivity() {
  17. super.startUp();
  18. String name = executionService.createProcessInstanceQuery().processInstanceId("decision.20001").uniqueResult().findActiveActivityNames().toString();
  19. print("到达节点名词",name);
  20. }
  21. }

上面介绍的decision节点的三种使用方法其实只是形式上的区别,归结到一点都是在创建流程实例的时候根据条件确定到达哪个任务节点,只不过是形式不一样而已,在具体的使用过程中可以根据自己的需要选择使用哪种方式。

JBPM具体应用之decision节点的使用的更多相关文章

  1. jbpm系列之五--使用decision节点判断分支情况

    我们在用JBPM做流程的时候,很多时候会遇到需要判断的节点.类似java中的switch,根据不同的状态,跳转到不同的节点. 首先我们定义一个流程信息,jpdl流程图如下 明显的可以看到,在此种情况下 ...

  2. JBPM4之decision节点:2、好学生|坏学生|超级学生

    JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...

  3. JBPM4之decision节点:1、好学生 | 坏学生

    JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...

  4. JBPM4之decision节点:3、程序猿|菜鸟|攻城狮|牛人

    JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...

  5. 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】

    OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...

  6. JBPM数据库表说明

    http://blog.163.com/tigerlion@126/blog/static/167675665201072642627400/ 最近这几天一直在研究JBPM工作流引擎,以下为JBMP的 ...

  7. JBPM工作流(二)——数据库表说明

    以下为JBMP的数据库说明(18张): 1 流程配置类数据库表: 1.1 JBPM_PROCESSDEFINITION:流程模版表 字段名 字段含义 主键 外键 ID_ 流程模版标识 √ × NAME ...

  8. 揭秘jbpm流程引擎内核设计思想及构架

    揭秘jbpm流程引擎内核设计思想及构架 作者 胡长城(银狐999)   1     前言 2     阅读本篇的基础准备 2.1      概念的基础 2.2      环境的基础 3     什么是 ...

  9. 工作流设计 zt

    工作流设计 业务流程管理模块是本平台的重要组成部分,要实现将已经发布的标准中规范化的流程转化为具体计算机中的流程从而实现流程的自动运转,将标准化成果与员工的日常工作紧密结合起来,具有重要意义. 业务流 ...

随机推荐

  1. New Concept English three (38)

    26w/m 45 Future historians will be in a unique position when they come to record the history of our ...

  2. [JS学习笔记]Javascript事件阶段:捕获、目标、冒泡

    当你在浏览器上点击一个按钮时,点击的事件不仅仅发生在按钮上,同时点击的还有这个按钮的容器元素,甚至也点击了整个页面. 事件流 事件流描述了从页面接收事件的顺序,但在浏览器发展到第四代时,浏览器开发团队 ...

  3. python 魔法方法补充(__setattr__,__getattr__,__getattribute__)

    python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...

  4. Android 开发最牛的图片轮播控件,基本什么都包含了。

    Android图片轮播控件  源码下载地址: Android 图片轮播 现在的绝大数app都有banner界面,实现循环播放多个广告图片和手动滑动循环等功能.因为ViewPager并不支持循环翻页, ...

  5. Leetcode 1014. Best Sightseeing Pair

    本题是leetcode121这道题的翻版,做法完全一样,也是扫一遍数组,维护两个值,一个是a[i]+i的最大值,另一个是a[i]+a[j]+i-j的最大值. class Solution: def m ...

  6. 一个通用Makefile详解

    我们在Linux环境下开发程序,少不了要自己编写Makefile,一个稍微大一些的工程下面都会包含很多.c的源文 件. 如果我们用gcc去一个一个编译每一个源文件的话,效率会低很多,但是如果我们可以写 ...

  7. 基于tcp协议的粘包问题(subprocess、struct)

    要点: 报头  固定长度bytes类型 1.粘包现象 粘包就是在获取数据时,出现数据的内容不是本应该接收的数据,如:对方第一次发送hello,第二次发送world,我放接收时,应该收两次,一次是hel ...

  8. kafka ksql && docker 安装试用

    备注: 使用docker 模式进行安装   1. 准备docker 环境(需要docker-compose)      docker 的安装不需要进行多描述了,直接yum 或者源码编译也可以     ...

  9. ehcache.xml配置

    <?xml version="1.0" encoding="UTF-8"?>   <ehcache xmlns:xsi="http: ...

  10. poj 3590 The shuffle Problem——DP+置换

    题目:http://poj.org/problem?id=3590 bzoj 1025 的弱化版.大概一样的 dp . 输出方案的时候小的环靠前.不用担心 dp 时用 > 还是 >= 来转 ...