jbpm系列之五--使用decision节点判断分支情况
我们在用JBPM做流程的时候,很多时候会遇到需要判断的节点。类似java中的switch,根据不同的状态,跳转到不同的节点。
首先我们定义一个流程信息,jpdl流程图如下
明显的可以看到,在此种情况下我们就必须用到decision节点来控制不同的业务跳转到不同的角色上。
我们的jpdl.xml中的代码为:
<?xml version="1.0" encoding="UTF-8"?> <process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="22,200,48,48">
<transition name="提交" to="exclusive1" g="-15,-20"/>
</start>
<decision name="exclusive1" expr="${node}" g="185,201,48,48">
<transition name="小于2天" to="组长" g="-49,-32"/>
<transition name="大于2天,小于10" to="科长" g="-56,-28"/>
<transition name="10天以上" to="主任" g="-47,-22"/>
</decision>
<task assignee="zuzhang" name="组长" g="338,69,92,52">
<transition name="组长批准" to="归档" g="-51,-26"/>
</task>
<task assignee="kezhang" name="科长" g="342,199,92,52">
<transition name="科长批准" to="归档" g="-49,-25"/>
</task>
<task assignee="zhuren" name="主任" g="349,325,92,52">
<transition name="主任批准" to="归档" g="-41,-25"/>
</task>
<task assignee="caiwu" name="归档" g="531,201,92,52">
<transition name="通过" to="end1" g="-35,-22"/>
</task>
<end name="end1" g="689,208,48,48"/>
</process>
此种方法是定义流程变量,流程变量等于transition中的哪个name的值就跳转到哪个角色中
在代码中:
package com.tgb.node.decision; import java.util.HashMap;
import java.util.Map; import org.jbpm.api.ProcessInstance; import com.tgb.video.JbpmTestCase;
import com.tgb.video.JbpmUtil; 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天,小于10");
ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision", map);
print("流程实例ID",processInstance.getId());
} @Override
public void getCurrectActivity() {
super.startUp();
String name = executionService.createProcessInstanceQuery().processInstanceId("decision.130001").uniqueResult().findActiveActivityNames().toString();
print("到达节点名称",name);
} @Override
public void getTask() {
// TODO Auto-generated method stub } @Override
public void completeTask() {
// TODO Auto-generated method stub } }
我们只需在代码中控制node的值即可跳转到不同的人员。
第二种:使用表达式判断
<?xml version="1.0" encoding="UTF-8"?> <process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="22,200,48,48">
<transition name="提交" to="exclusive1" g="-15,-20"/>
</start>
<decision name="exclusive1" g="185,201,48,48">
<transition name="小于2天" to="组长" g="-49,-32">
<condition expr="${days lt 2}"/>
</transition>
<transition name="大于2天,小于10" to="科长" g="-56,-28">
<condition expr="${days ge 2 and days le 10}"/>
</transition>
<transition name="10天以上" to="主任" g="-47,-22">
<condition expr="${days gt 10}"/>
</transition>
</decision>
<task assignee="zuzhang" name="组长" g="338,69,92,52">
<transition name="组长批准" to="归档" g="-51,-26"/>
</task>
<task assignee="kezhang" name="科长" g="342,199,92,52">
<transition name="科长批准" to="归档" g="-49,-25"/>
</task>
<task assignee="zhuren" name="主任" g="349,325,92,52">
<transition name="主任批准" to="归档" g="-41,-25"/>
</task>
<task assignee="caiwu" name="归档" g="531,201,92,52">
<transition name="通过" to="end1" g="-35,-22"/>
</task>
<end name="end1" g="689,208,48,48"/>
</process>
此种方法即把判断放到配置文件中,只需传过一个数字来判断即可。
public void createInstance() {
super.startUp();
Map<String,Object> map = new HashMap<String,Object>();
map.put("days", 15);
ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision", map);
print("流程实例ID",processInstance.getId());
}
创建流程实例代码如上,将参数用days传过来即可判断。
第三种方法:监听判断
写一个类MyDecision,继承DecisionHandler
在jpdl文件中配置上MyDecision,通过复写decide方法,用execution将参数传过来。
<?xml version="1.0" encoding="UTF-8"?> <process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="22,200,48,48">
<transition name="提交" to="exclusive1" g="-15,-20"/>
</start>
<decision name="exclusive1" g="185,201,48,48">
<handler class="com.tgb.node.decision.MyDecision"/>
<transition name="到组长" to="组长" g="-49,-32">
</transition>
<transition name="到科长" to="科长" g="-56,-28">
</transition>
<transition name="到主任" to="主任" g="-47,-22">
</transition>
</decision>
<task assignee="zuzhang" name="组长" g="338,69,92,52">
<transition name="组长批准" to="归档" g="-51,-26"/>
</task>
<task assignee="kezhang" name="科长" g="342,199,92,52">
<transition name="科长批准" to="归档" g="-49,-25"/>
</task>
<task assignee="zhuren" name="主任" g="349,325,92,52">
<transition name="主任批准" to="归档" g="-41,-25"/>
</task>
<task assignee="caiwu" name="归档" g="531,201,92,52">
<transition name="通过" to="end1" g="-35,-22"/>
</task>
<end name="end1" g="689,208,48,48"/>
</process>
MyDecision类中代码:
package com.tgb.node.decision; import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.api.model.OpenExecution; 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.endsWith("科长")){
return "到科长";
}else{
return "到主任";
}
}
}
此种方法将判断逻辑交给了java代码,不用重新部署流程。
jbpm系列之五--使用decision节点判断分支情况的更多相关文章
- JBPM具体应用之decision节点的使用
JBPM工作流引擎为我们提供了许多的节点应用,每一个节点都有其不同的作用,其中有四个比较常用的节点,他们分别decision,fork,state和task.在本文中我们先介绍decision节点,余 ...
- JBPM4之decision节点:2、好学生|坏学生|超级学生
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入门—— ...
- JBPM4之decision节点:1、好学生 | 坏学生
JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...
- JBPM4入门——8.等待节点的分支执行
JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...
- 给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化
给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化 标签: ajaxdictionaryjsonobject服务器function 2012-07-25 18:41 2242人阅读 ...
- Dynamic CRM 2013学习笔记(三十三)自定义审批流4 - 规则节点 -有分支的流程处理
上次介绍过节点的基本配置<Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置>,这次介绍下规则节点,因为有时流程里会有一些分支.合并,这时就要用到规则节点 ...
- Python猫荐书系列之五:Python高性能编程
稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非 Python 与 Go 莫属,于是,隔三差五就会有人问:这两种语言谁更厉害/好找工作/高工资…… 对于编程语言的争论,就是猿界的生 ...
- Red Gate系列之五 .NET Reflector 7.6.1.824 Edition .NET程序反编译神器(附插件安装教程2012-10-13更新) 完全破解+使用教程
原文:Red Gate系列之五 .NET Reflector 7.6.1.824 Edition .NET程序反编译神器(附插件安装教程2012-10-13更新) 完全破解+使用教程 Red Gate ...
随机推荐
- SSIS 实例 从Ftp获取多个文件并对数据库进行增量更新。
整个流程 Step 1 放置一个FTP Task 将远程文件复制到本地 建立FTP链接管理器后 Is LocalPatchVariable 设置为Ture 并创建一个变量设置本地路径 Operatio ...
- JSP 和 Servlet 有哪些相同点和不同点, 他们之间的联系是什么?
jsp和servlet的区别和联系:1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能 ...
- UVa1225 Digit Counting
#include <stdio.h>#include <string.h> int main(){ int T, N, i, j; int a[10]; sc ...
- C++静态局部对象
7.5局部对象 在C++语言中,对于每一个变量和对象,都有其各自的作用域和生存期,这两个概念一个是空间的,一个是时间的.对象的作用域指的是该变量的程序文本区,对象的生存期则是程序执行过程中对象存在的时 ...
- Springmvc异步上传文件
<script src="js/jquery.js" type="text/javascript"></script><scrip ...
- js函数调用模式总结
在javascript中一共有四种调用模式:方法调用模式.函数调用模式.构造器调用模式和apply调用模式.这些模式在如何初始化关键参数this上存在差异 方法调用模式 当一个函数被保存为对象的一个属 ...
- QQwry
http://blog.runphp.net/archives/156 http://wenku.baidu.com/link?url=yvd3_EpMM66r6H4qkx3oqcaU2JZNAQv_ ...
- 【转】 IE6 IE7 IE8 css bug兼容性解决方法总结归纳
1:li边距“无故”增加 任何事情都是有原因的,li边距也不例外. 先描述一下具体状况:有些时候li边距会突然增 加很多,值也不固定(只在IE6/IE7有这种现象),让人摸不着头脑,仔细“研究”发现是 ...
- csv批量导入mysql命令
今天把从Kaggle上下载下来的csv数据导入mysql,想做个统计分析,怎奈csv文件有些大.所以仅仅能用mysql 命令导入,现mark下,以备以后不时之需: 1. 导入: 基本的语法: load ...
- Android API 中文(76)——AdapterView.OnItemLongClickListener
前言 本章内容是android.widget.AdapterView.OnItemLongClickListener,版本为Android 2.3 r1,翻译来自"cnmahj", ...