JBPM具体应用之decision节点的使用
JBPM工作流引擎为我们提供了许多的节点应用,每一个节点都有其不同的作用,其中有四个比较常用的节点,他们分别decision,fork,state和task。在本文中我们先介绍decision节点,余下的节点在下文介绍。decision节点,顾名思义是一个判断节点,通过判断条件来决定执行哪项任务,decision节点的使用方式又分为三种,他们依次是:
(1)handler方式:使用handler标签将具体的执行方向交给java类来决定,jpdl文件如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <process key="decision2" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
- <start name="start1" g="43,136,48,48">
- <transition name="提交" to="exclusive1" g="-14,-25"/>
- </start>
- <decision name="exclusive1" g="153,137,48,48">
- <handler class="com.tgb.node.decision.MyDecision"/>
- <transition name="到组长" to="组长" g="-52,-20">
- </transition>
- <transition name="到科长" to="科长" g="-52,-20">
- </transition>
- <transition name="到主任" to="主任" g="-52,-20">
- </transition>
- </decision>
- <task assignee="zuzhang" name="组长" g="323,40,92,52">
- <transition name="组长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="kezhang" name="科长" g="333,135,92,52">
- <transition name="科长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="zhuren" name="主任" g="336,233,92,52">
- <transition name="主任批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="caiwu" name="归档" g="579,133,92,52">
- <transition name="通过" to="end1" g="-29,-23"/>
- </task>
- <end name="end1" g="749,141,48,48"/>
- </process>
在上面的jpdl文件中,我们可以看到当流程启动的时候具体执行那个task是由decision决定的,而decision又将判断权交给了MyDecision类,下面来看Decision类代码:
- 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.equals("科长")){
- return "到科长";
- }else{
- return "到主任";
- }
- }
- }
这个Decision类是在什么时候做出的判断呢,非常简单的就可以想到,既然当创建流程实例的时候会自动进入到第一个任务节点,那么Decision类起判断作用的时刻毫无疑问应该是在创建流程实例的时候,下面我们就来看一下具体的创建过程:
- public class TestDecision extends JbpmTestCase implements JbpmUtil {
- @Override
- public void deploy() {
- super.startUp();
- repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/decision/decision2.jpdl.xml").deploy();
- }
- @Override
- public void createInstance() {
- super.startUp();
- Map<String,Object> map = new HashMap<String,Object>();
- map.put("to", "组长");
- ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision2", map);
- print("流程实例ID",processInstance.getId());
- }
- @Override
- public void getCurrentActivity() {
- super.startUp();
- String name = executionService.createProcessInstanceQuery().processInstanceId("decision.20001").uniqueResult().findActiveActivityNames().toString();
- print("到达节点名词",name);
- }
- }
在上面的代码中我们可以看到我们将判断条件放到了map中,在启动实例的时候将map中的条件取出放入到Decision类中进行判断。
(2)EL表达式进行判断。首先来看jpdl文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
- <start name="start1" g="43,136,48,48">
- <transition name="提交" to="exclusive1" g="-14,-25"/>
- </start>
- <decision name="exclusive1" expr="${node}" g="153,137,48,48">
- <transition name="小于2天" to="组长" g="-52,-20"/>
- <transition name="大于2天,小于10" to="科长" g="-52,-20"/>
- <transition name="10天以上" to="主任" g="-52,-20"/>
- </decision>
- <task assignee="zuzhang" name="组长" g="323,40,92,52">
- <transition name="组长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="kezhang" name="科长" g="333,135,92,52">
- <transition name="科长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="zhuren" name="主任" g="336,233,92,52">
- <transition name="主任批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="caiwu" name="归档" g="579,133,92,52">
- <transition name="通过" to="end1" g="-29,-23"/>
- </task>
- <end name="end1" g="749,141,48,48"/>
- </process>
使用EL表达式省去了第三方类进行判断的麻烦,我们直接将判断条件写在java代码中进行判断,后台代码如下:
- 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天");
- ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision", map);
- print("流程实例ID",processInstance.getId());
- }
- @Override
- public void getCurrentActivity() {
- super.startUp();
- String name = executionService.createProcessInstanceQuery().processInstanceId("decision.20001").uniqueResult().findActiveActivityNames().toString();
- print("到达节点名词",name);
- }
- }
(3)使用Condition标签,将判断条件写在EL表达式中进行判断。仍然先看jpdl文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <process key="decision1" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
- <start name="start1" g="43,136,48,48">
- <transition name="提交" to="exclusive1" g="-14,-25"/>
- </start>
- <decision name="exclusive1" g="153,137,48,48">
- <transition name="小于2天" to="组长" g="-52,-20">
- <condition expr="${days lt 2}"/>
- </transition>
- <transition name="大于2天,小于10" to="科长" g="-52,-20">
- <condition expr="${days ge 2 and days le 10}"/>
- </transition>
- <transition name="10天以上" to="主任" g="-52,-20">
- <condition expr="${days gt 10}"/>
- </transition>
- </decision>
- <task assignee="zuzhang" name="组长" g="323,40,92,52">
- <transition name="组长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="kezhang" name="科长" g="333,135,92,52">
- <transition name="科长批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="zhuren" name="主任" g="336,233,92,52">
- <transition name="主任批准" to="归档" g="-52,-20"/>
- </task>
- <task assignee="caiwu" name="归档" g="579,133,92,52">
- <transition name="通过" to="end1" g="-29,-23"/>
- </task>
- <end name="end1" g="749,141,48,48"/>
- </process>
由于EL表达式具有的灵活性,我们可以在后台代码中仅传参数,而将具体的判断交给el表达式来完成,后台代码如下:
- public class TestDecision extends JbpmTestCase implements JbpmUtil {
- @Override
- public void deploy() {
- super.startUp();
- repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/decision/decision1.jpdl.xml").deploy();
- }
- @Override
- public void createInstance() {
- super.startUp();
- Map<String,Object> map = new HashMap<String,Object>();
- map.put("days", 1);
- ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision1", map);
- print("流程实例ID",processInstance.getId());
- }
- @Override
- public void getCurrentActivity() {
- super.startUp();
- String name = executionService.createProcessInstanceQuery().processInstanceId("decision.20001").uniqueResult().findActiveActivityNames().toString();
- print("到达节点名词",name);
- }
- }
上面介绍的decision节点的三种使用方法其实只是形式上的区别,归结到一点都是在创建流程实例的时候根据条件确定到达哪个任务节点,只不过是形式不一样而已,在具体的使用过程中可以根据自己的需要选择使用哪种方式。
JBPM具体应用之decision节点的使用的更多相关文章
- jbpm系列之五--使用decision节点判断分支情况
我们在用JBPM做流程的时候,很多时候会遇到需要判断的节点.类似java中的switch,根据不同的状态,跳转到不同的节点. 首先我们定义一个流程信息,jpdl流程图如下 明显的可以看到,在此种情况下 ...
- JBPM4之decision节点:2、好学生|坏学生|超级学生
JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...
- JBPM4之decision节点:1、好学生 | 坏学生
JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...
- JBPM4之decision节点:3、程序猿|菜鸟|攻城狮|牛人
JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...
- 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】
OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...
- JBPM数据库表说明
http://blog.163.com/tigerlion@126/blog/static/167675665201072642627400/ 最近这几天一直在研究JBPM工作流引擎,以下为JBMP的 ...
- JBPM工作流(二)——数据库表说明
以下为JBMP的数据库说明(18张): 1 流程配置类数据库表: 1.1 JBPM_PROCESSDEFINITION:流程模版表 字段名 字段含义 主键 外键 ID_ 流程模版标识 √ × NAME ...
- 揭秘jbpm流程引擎内核设计思想及构架
揭秘jbpm流程引擎内核设计思想及构架 作者 胡长城(银狐999) 1 前言 2 阅读本篇的基础准备 2.1 概念的基础 2.2 环境的基础 3 什么是 ...
- 工作流设计 zt
工作流设计 业务流程管理模块是本平台的重要组成部分,要实现将已经发布的标准中规范化的流程转化为具体计算机中的流程从而实现流程的自动运转,将标准化成果与员工的日常工作紧密结合起来,具有重要意义. 业务流 ...
随机推荐
- 模拟form提交数据
最近在做一个项目,发现ajax不能enctype=”multipart/form-data” 属性的表单,没办法,只能使用form表单直接提交的方法了,但是form表单直接提交会跳转页面,这样很不友好 ...
- UI - 视图控制器跳转另一个视图控制器特效总结
1. 从一个视图控制器跳转另一个视图控制器的方式是可以进行设置的 CATransition *animation = [[CATransition alloc]init]; animation.dur ...
- Django和pymysql搭建学员管理系统
学员管理系统 项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求.因此公司急需一套方便易用的“学员管理系统”,来提 ...
- Some Interview Questions About Python
一大波超链接即将袭来 Django认证流程 Python实现阶乘 Python文件处理 Python统计日志文件IP出现次数 JSON数据解析 JSON数据解析2 买卖股票的最佳时期 读取一个大文件比 ...
- 【PL/SQL编程】SQL与PL/SQL的区别
SQL概念: SQL是结构化查询语言,由数据定义语言.数据操纵语言.数据控制语言构成,它不面向过程,即前一条语句与后一条语句无关.它没有流程控制,也不存在变量. PL SQL概念: PL/SQL ...
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 lock-on-active
lock-on-active 当在规则上使用ruleflow-group属性或agenda-group属性的时候,将lock-on-active 属性的值设置为true,可避免因某些Fact对象被修改 ...
- Android内存优化(二)DVM和ART的GC日志分析
相关文章 Android内存优化系列 Java虚拟机系列 前言 在Java虚拟机(三)垃圾标记算法与Java对象的生命周期这篇文章中,提到了Java虚拟机的GC日志.DVM和ART的GC日志与Java ...
- js实现把中文、英文标点转换
所有英文符号转换成中文的符号 <SCRIPT LANGUAGE="JavaScript"> <!-- function meizz(str) { var tmp ...
- Lumen实现用户注册登录认证
Lumen实现用户注册登录认证 前言 Lumen是一个基于Laravel的微框架,号称是以速度为生.截用Lumen官网的一段,号称是比silex和slim还要快. 本文将用Lumen来实现一个完整的用 ...
- 利用struts2的json返回方式来控制jquery.validate的remote框架,进行表单验证