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. RAD Studio Mobile Roadmap updated,XE5 will released on next month, Andriod will be supported.

    RAD Studio Mobile Roadmap updated   Embarcadero updated his RAD Studio Mobile Roadmap. This concern ...

  2. 作为一名Java开发工程师需要掌握的专业技能

    在学习Java编程完之后,学员们面临的就是就业问题.作为一名Java开发工程师,企业在招聘的时候,也是有一定的标准的. 为了帮助大家更好的找到适合自己的工作,在这里分享了作为一名Java开发工程师需要 ...

  3. docker 基本学习

    Docker的应用场景: 加速本地开发和构建流程,使其更加高效.更加轻量化.本地开发人员可以构建.运行并分享Docker容器.容器可以在开发环境中构建,然后轻松地提交到测试环境中,并最终进入生产环境. ...

  4. 【学习】JennyHui学英语 - Bingo口语笔记

    学习素材:Bingo说美语 Hold系列 如何吞音 表示“无所谓” Pick系列 英式和美式英语的发音区别 表示“迷茫” Break系列 爆破音发音技巧 表示“不相信” 常见词汇的缩读 表示“身体抱恙 ...

  5. HWOJ-求字符串最后一个单词的长度

    题目:给定一个字符串,求最后一个单词的长度,每个单词中间有空格. 例如:输入:hello world   输出:5 C代码:通过. #include <stdio.h> #define m ...

  6. [Luogu3769][CH弱省胡策R2]TATT

    luogu 题意 其实就是四维偏序. sol 第一维排序,然后就只需要写个\(3D-tree\)了. 据说\(kD-tree\)的单次查询复杂度是\(O(n^{1-\frac{1}{k}})\).所以 ...

  7. timer用作timestamp及其他

    niosii中使用时间戳是很有用的,可以查看代码的执行时间是多少,在使用timestamp的过程中遇到一些问题现在做一下记录. 1.硬件部分构建软核没什么,就加一个timer就行了,加完之后自动获得基 ...

  8. Hadoop体系结构之 Mapreduce

    MR框架是由一个单独运行在主节点上的JobTracker和运行在每个集群从节点上的TaskTracker共同组成.主节点负责调度构成一个作业的所有任务,这些任务分布在不同的不同的从节点上.主节点监视它 ...

  9. utf_8 和 GBK 不搭出现乱码(转)

    今天调数据的时候发现调出来的一直是乱码,用了各种方法都未解决,简单的调数据用了好长时间,最后突然发现了一个问题 页面的 <meta http-equiv="Content-Type&q ...

  10. (转)App工程结构搭建:几种常见Android代码架构分析

    关于Android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优美的分层总是一种舒服的享受的. 从艺术的角度看,其实我们是在追求一种美. 本文先分析几个当 ...