activiti工作流引擎之uel表达式
本人做了一个微信公众号,用于分享各类视频学习资源和我多年学习经验,喜欢的可以关注哦!

有了前面几章,我们肯定有一定的困惑,activiti如何与实际业务整合,比如一条采购单,如何跟一个流程实例互相关联起来?
这里就需要使用到activiti启动流程实例时设置一个流程实例的businessKey(一般存储我们一条采购单的id)
1,启动流程实例设置其businessKey

/**
* 启动一个流程实例,设置其业务id
*/
@Test
public void startProInsWithKey() {
RuntimeService runtimeService = engine.getRuntimeService();String processDefinitionKey </span>= "purchasingflow"<span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置一个businessKey,在我实际业务中可能是一个采购单,或者订单之类的id</span>
String businessKey ="111"<span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 根据流程定义的key启动一个流程实例</span>
ProcessInstance processInstance =<span style="color: #000000;"> runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey);
System.out.println(</span>"流程实例id:" +<span style="color: #000000;"> processInstance.getId());
System.out.println(</span>"流程定义id:" +<span style="color: #000000;"> processInstance.getProcessDefinitionId()); }</span></pre>
一般情况下,我们是在用户保存一条采购单的时候,启动这个实例,并且动态获取采购单的id(也就是用作流程实例的businessKey),并且我们还会在采购单表中保存这个流程实例的id,双向一对一绑定,方便业务查询
2,根据采购单的id(也就是用作流程实例的businessKey),动态的查询出对应的流程实例

/**
* 通过businessKey查询流程实例
*/
@Test
public void queryProInsWithKey(){
RuntimeService runtimeService = engine.getRuntimeService();
String businessKey ="111";ProcessInstanceQuery instanceQuery </span>=<span style="color: #000000;"> runtimeService.createProcessInstanceQuery();
</span><span style="color: #008000;">//</span><span style="color: #008000;">根据其流程定义key和业务id businessKey查询出对应的流程实例,一般只有一条</span>
instanceQuery.processInstanceBusinessKey(businessKey);
//查询出唯一的一条流程实例
ProcessInstance processInstance = instanceQuery.singleResult();System.out.println(</span>"流程实例id:"+<span style="color: #000000;">processInstance.getId());
System.out.println(</span>"流程定义id:"+<span style="color: #000000;">processInstance.getProcessDefinitionId()); }</span></pre>
到这里,我们就清楚了一个流程实例和实际业务数据的绑定
大家到这里也启动了很多的流程实例了,发现我们的任务办理人都是写死为zhangsan,lisi之类的,那么我们可以动态的指定吗,这就需要使用到我们的uel表达式了
首先uel表达式到底是什么呢?
UEL是java EE6规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti支持两个UEL表达式:UEL-value和UEL-method。我们都会分别做介绍
(一)我们先来演示uel-value
首先做个简单的使用带大家入门
使用步骤:(看不明白的运行下面的代码走一遍再回头看)
1,在任务的节点,不直接指定处理人的id,设置处理人表达式${assignee},并且重新部署流程定义
2, 启动一个流程实例是设置启动变量动态设置assignee的值
3,查看并验证下一个任务的处理人是否为我们动态设置
1,首先我们设置节点
2,在启动代码时动态设置assignee的值

/**
* 启动流程实例时设置全局变量
*/
@Test
public void startProInsWithArgs(){RuntimeService runtimeService </span>=<span style="color: #000000;"> engine.getRuntimeService(); String processDefinitionKey </span>= "purchasingflow"<span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置其启动的全局变量参数,其value可以是javabean,也可以是普通字符串,数字</span>
Map<String,Object> variables = <span style="color: #0000ff;">new</span> HashMap<String, Object><span style="color: #000000;">();
variables.put(</span>"assignee", "feige"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置流程启动时,设置参数启动</span>
ProcessInstance processInstance =<span style="color: #000000;"> runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
System.out.println(</span>"流程实例id:" +<span style="color: #000000;"> processInstance.getId());
System.out.println(</span>"流程定义id:" +<span style="color: #000000;"> processInstance.getProcessDefinitionId()); }</span></pre>
3,这个时候我们通过查看数据库,查看act_ru_task当前运行的任务,查看
从上面的我们可以看到流程走到了,创建采购单,并且采购的assignee处理人为feige
因为当我们走到了创建采购单时,会从当前流程实例的全局变量查找name为assignee的值,如果查询到,则将这个assignee的值赋给这个节点,如果我们动态设置了,但是走到这个节点前(为什么说节点前呢,因为还可以在别的时候设置变量,后面的章节会讲)
没有找到这个assignee变量的值,会报错的,大家可以自己试一试
当然除了上面的设置方法,我们还有其他的设置方法来动态设置其节点的值吗?答案是肯定的,启动的流程时候的参数的value,不仅仅可以是String类型,还可以是Object对象(序列化的),Map,List,Array
我们这里采用对象做演示,执行步骤如下
1,设置流程的第一个节点动态的值为${user.userId},他会默认查找变量name为user的对应的值的getUserId获取值,重新部署流程定义
2,启动流程时,设置这个user的javabean到流程的全局变量中
3,查看走到这个节点的当前任务的处理人是否是我们user的userId变量的值
1,设置节点
2,设置javabean User对象并且在流程实例启动时设置进去

public class User implements Serializable{
/**
* 用于序列化
*/
private static final long serialVersionUID = 7717000074223077256L;
private String userId;
private String sex;
private String name;</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> User(String userId, String sex, String name) {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">this</span>.userId =<span style="color: #000000;"> userId;
</span><span style="color: #0000ff;">this</span>.sex =<span style="color: #000000;"> sex;
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getUserId() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> userId;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setUserId(String userId) {
</span><span style="color: #0000ff;">this</span>.userId =<span style="color: #000000;"> userId;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getSex() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> sex;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setSex(String sex) {
</span><span style="color: #0000ff;">this</span>.sex =<span style="color: #000000;"> sex;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name) {
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}
}


/**
* 启动流程设置一个user用户到全局变量中
*/
@Test
public void startProInsWithObj(){RuntimeService runtimeService </span>=<span style="color: #000000;"> engine.getRuntimeService(); String processDefinitionKey </span>= "purchasingflow"<span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;">设置其启动的全局变量参数,其value设置为user对象,这里写死</span>
User user = <span style="color: #0000ff;">new</span> User("101","男","张三"<span style="color: #000000;">); Map</span><String,Object> variables = <span style="color: #0000ff;">new</span> HashMap<String, Object><span style="color: #000000;">();
variables.put(</span>"user"<span style="color: #000000;">, user);
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置流程启动时,设置参数启动</span>
ProcessInstance processInstance =<span style="color: #000000;"> runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
System.out.println(</span>"流程实例id:" +<span style="color: #000000;"> processInstance.getId());
System.out.println(</span>"流程定义id:" +<span style="color: #000000;"> processInstance.getProcessDefinitionId()); }</span></pre>
3,到这里流程实例启动成功,我们观察数据库的当前任务表,观察第一个节点的处理人是否为我们设置的101的userId
设置成功!
(二)演示uel-method
执行步骤
1,设置节点的执行人为${method.getUserNameByUserId(userId)} ,其中method方法是我们注入到spring中的一个类,userId是我们设置的全局变量
2,将method方法注入到activiti的processEngineConfiguration的bean中(在我们的activiti.cfg.xml中)
3,启动一个流程设置全局变量userId作为启动参数,看看是否走到这个节点的处理人是我们method方法getUserNameByUserId返回的name
好了,直接上代码
1,设置节点,重新部署流程定义
2,method的java方法和activiti.cfg.xml的注入配置

public class CommonMethod{</span><span style="color: #0000ff;">public</span> String getUserNameByUserId(<span style="color: #0000ff;">int</span><span style="color: #000000;"> userId){ </span><span style="color: #0000ff;">return</span> "activiti"+<span style="color: #000000;">userId; }
}


<bean class="cn.nfcm.po.CommonMethod" id="commonmethod"></bean><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="processEngineConfiguration"</span><span style="color: #ff0000;">
class</span><span style="color: #0000ff;">="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"</span><span style="color: #0000ff;">></span>
<span style="color: #008000;"><!--</span><span style="color: #008000;"> 数据源 </span><span style="color: #008000;">--></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="dataSource"</span> <span style="color: #0000ff;">/></span>
<span style="color: #008000;"><!--</span><span style="color: #008000;"> activiti数据库表处理策略 </span><span style="color: #008000;">--></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="databaseSchemaUpdate"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="true"</span> <span style="color: #0000ff;">/></span>
<span style="color: #008000;"><!--</span><span style="color: #008000;"> 可以注入多个类到activiti的beans中,其中key对应的就是我们的类名 </span><span style="color: #008000;">--></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="beans"</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">map</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">entry </span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="commonmethod"</span><span style="color: #ff0000;"> value-ref</span><span style="color: #0000ff;">="commonmethod"</span> <span style="color: #0000ff;">/></span>
<span style="color: #0000ff;"></</span><span style="color: #800000;">map</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"></</span><span style="color: #800000;">property</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span></pre>
3,启动一个流程实例

/**
* 根据方法得到值
*/
@Test
public void startProInsWithMethod(){RuntimeService runtimeService </span>=<span style="color: #000000;"> engine.getRuntimeService(); String processDefinitionKey </span>= "purchasingflow"<span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;">这里设置userId为8,走到第一个节点会查找我们注入进去的commonmethod的getUserNameByUserId方法并传递userId</span>
Map<String,Object> variables = <span style="color: #0000ff;">new</span> HashMap<String, Object><span style="color: #000000;">();
variables.put(</span>"userId", 8<span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;">设置流程启动时,设置参数启动</span>
ProcessInstance processInstance =<span style="color: #000000;"> runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
System.out.println(</span>"流程实例id:" +<span style="color: #000000;"> processInstance.getId());
System.out.println(</span>"流程定义id:" +<span style="color: #000000;"> processInstance.getProcessDefinitionId()); }</span></pre>
到这里我们会发现流程启动成功,并且流程的当前任务处理人为acitiviti8,在实际的应用中因为都是spring管理的类,我们可以进行多种多样的查询赋值,非常方便!
原文地址:https://www.cnblogs.com/nfcm/p/6408481.html
activiti工作流引擎之uel表达式的更多相关文章
- (4)activiti工作流引擎之uel表达式
有了前面几章,我们肯定有一定的困惑,activiti如何与实际业务整合,比如一条采购单,如何跟一个流程实例互相关联起来? 这里就需要使用到activiti启动流程实例时设置一个流程实例的busines ...
- Activiti工作流引擎参考资料
Activiti工作流引擎使用 工作流-Activiti核心API介绍 传智播客Activiti工作流视频教程(企业开发实例讲解) 工作流引擎Activiti演示项目 http://www.kafei ...
- Activiti工作流引擎简介
Activiti工作流引擎简介 一.概述 Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活 ...
- Activiti工作流引擎数据库表结构
Activiti工作流引擎数据库表结构 一.数据库表的命名 Acitiviti数据库中表的命名都是以ACT_开头的.第二部分是一个两个字符用例表的标识.此用例大体与服务API是匹配的. ACT_RE_ ...
- Activiti工作流引擎开发系列
Activiti工作流引擎开发系列-01 作者:Jesai 没有伞的孩子,只能光脚奔跑! 前言: 初次接触工作流这个概念是自从2014年11月份开始,当时是由于我的毕业设计需要,还记得当时我毕业设计的 ...
- activiti工作流引擎
参考文章 Activiti-5.18.0与springMvc项目集成和activiti-explorer单独部署Web项目并与业务数据库关联方法(AutoEE_V2实现方式) https://blog ...
- Activiti工作流引擎使用
http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html 1.简单介工作流引擎与Activiti 对于工作流引擎的 ...
- 基于Activiti工作流引擎实现的请假审核流程
概要 本文档介绍的是某商用中集成的Activiti工作流的部署及使用,该框架用的Activiti版本为5.19.0.本文档中主要以一个请假流程为例子进行说明,该例子的流程图如下: 这是一个可以正常运作 ...
- Activiti工作流引擎核心介绍
引言 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速.超稳定的 BPMN 2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更 ...
随机推荐
- NOIP模拟 9.09
AK300分 果实计数 (count.pas/.c/.cpp) 时间限制:1s,空间限制32MB 题目描述: 淘淘家有棵奇怪的苹果树,这棵树共有n+1层,标号为0~n.这棵树第0层只有一个节点,为根节 ...
- String int 变量互相转化
int -> String int i=12345;String s="";第一种方法:s=i+"";第二种方法:s=String.valueOf(i); ...
- [ 浙江大学 数据库系统原理 ] [ MiniSQL ]课程设计
工作流程图如下.代码详见https://github.com/gstggsstt/minisql. 注:课程设计时间紧迫,编码基本没有性能考虑,仅限于实现功能,索引未使用B+tree.
- Linux使用注意事项
1.Linux严格区分大小写 2.Linux中所有内容以文件形式保存,包括硬件 3.修改任何设置,若想永久生效,都需要修改配置文件(除非某些发现版已经默认设置为同时修改内存和硬盘数据). 4.Linu ...
- PHP Laravel系列之环境搭建( VirtualBox+Vagrant+Homestead+系列网址)
搭建环境从来都是阻挡一门新技能的最致命的硬伤,为了这个环境,我又是花费了半天的时间,各种问题层出不穷,下面基于网上的一些教程(我看到的都多少有些问题) 开始的时候是在实验楼这个平台上开始学习的,不过 ...
- poj2112 最大流
我用Dinic写的.G++ 1800ms 很慢,c++直接超时.优化后的 141ms,很快! 对于此题,建图方法很巧妙,通常想到求距离,那就会朝距离的方向建图,但是这题根据牛个数来建图,然后二分距离. ...
- KiCad 安装后没有元件怎么办?
KiCad 安装后没有元件怎么办? 按以下步骤试试. 卸载 KiCad EDA. 按 Win+R 输入 %appdata%/kicad 进入 KiCad 的配置目录. 将里面的内容打包成一个 zip ...
- Java SDUT-2562_相似三角形
相似三角形 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给出两个三角形的三条边,判断是否相似. Input 多组数据 ...
- Gartner:阿里云位列全球云数据库市场份额前三,数据库未来需上云
近日,国际权威研究机构Gartner发布 <The Future of the Database Management System (DBMS) Market Is Cloud>报告,鲜 ...
- 干货|Spring Cloud Bus 消息总线介绍
继上一篇 干货|Spring Cloud Stream 体系及原理介绍 之后,本期我们来了解下 Spring Cloud 体系中的另外一个组件 Spring Cloud Bus (建议先熟悉 Spri ...