有了前面几章,我们肯定有一定的困惑,activiti如何与实际业务整合,比如一条采购单,如何跟一个流程实例互相关联起来?

这里就需要使用到activiti启动流程实例时设置一个流程实例的businessKey(一般存储我们一条采购单的id)

1,启动流程实例设置其businessKey

  1. /**
  2. * 启动一个流程实例,设置其业务id
  3. */
  4. @Test
  5. public void startProInsWithKey() {
  6. RuntimeService runtimeService = engine.getRuntimeService();
  7.  
  8. String processDefinitionKey = "purchasingflow";
  9. //设置一个businessKey,在我实际业务中可能是一个采购单,或者订单之类的id
  10. String businessKey ="111";
  11. // 根据流程定义的key启动一个流程实例
  12. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey);
  13. System.out.println("流程实例id:" + processInstance.getId());
  14. System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
  15.  
  16. }

一般情况下,我们是在用户保存一条采购单的时候,启动这个实例,并且动态获取采购单的id(也就是用作流程实例的businessKey),并且我们还会在采购单表中保存这个流程实例的id,双向一对一绑定,方便业务查询

2,根据采购单的id(也就是用作流程实例的businessKey),动态的查询出对应的流程实例

  1. /**
  2. * 通过businessKey查询流程实例
  3. */
  4. @Test
  5. public void queryProInsWithKey(){
  6. RuntimeService runtimeService = engine.getRuntimeService();
  7. String businessKey ="111";
  8.  
  9. ProcessInstanceQuery instanceQuery = runtimeService.createProcessInstanceQuery();
  10. //根据其流程定义key和业务id businessKey查询出对应的流程实例,一般只有一条
  11. instanceQuery.processInstanceBusinessKey(businessKey);
  12. //查询出唯一的一条流程实例
  13. ProcessInstance processInstance = instanceQuery.singleResult();
  14.  
  15. System.out.println("流程实例id:"+processInstance.getId());
  16. System.out.println("流程定义id:"+processInstance.getProcessDefinitionId());
  17.  
  18. }

到这里,我们就清楚了一个流程实例和实际业务数据的绑定

大家到这里也启动了很多的流程实例了,发现我们的任务办理人都是写死为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的值

  1. /**
  2. * 启动流程实例时设置全局变量
  3. */
  4. @Test
  5. public void startProInsWithArgs(){
  6.  
  7. RuntimeService runtimeService = engine.getRuntimeService();
  8.  
  9. String processDefinitionKey = "purchasingflow";
  10. //设置其启动的全局变量参数,其value可以是javabean,也可以是普通字符串,数字
  11. Map<String,Object> variables = new HashMap<String, Object>();
  12. variables.put("assignee", "feige");
  13. //设置流程启动时,设置参数启动
  14. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
  15. System.out.println("流程实例id:" + processInstance.getId());
  16. System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
  17.  
  18. }

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对象并且在流程实例启动时设置进去

  1. public class User implements Serializable{
  2. /**
  3. * 用于序列化
  4. */
  5. private static final long serialVersionUID = 7717000074223077256L;
  6. private String userId;
  7. private String sex;
  8. private String name;
  9.  
  10. public User(String userId, String sex, String name) {
  11. super();
  12. this.userId = userId;
  13. this.sex = sex;
  14. this.name = name;
  15. }
  16. public String getUserId() {
  17. return userId;
  18. }
  19. public void setUserId(String userId) {
  20. this.userId = userId;
  21. }
  22. public String getSex() {
  23. return sex;
  24. }
  25. public void setSex(String sex) {
  26. this.sex = sex;
  27. }
  28. public String getName() {
  29. return name;
  30. }
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34.  
  35. }
  1. /**
  2. * 启动流程设置一个user用户到全局变量中
  3. */
  4. @Test
  5. public void startProInsWithObj(){
  6.  
  7. RuntimeService runtimeService = engine.getRuntimeService();
  8.  
  9. String processDefinitionKey = "purchasingflow";
  10.  
  11. //设置其启动的全局变量参数,其value设置为user对象,这里写死
  12. User user = new User("101","男","张三");
  13.  
  14. Map<String,Object> variables = new HashMap<String, Object>();
  15. variables.put("user", user);
  16. //设置流程启动时,设置参数启动
  17. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
  18. System.out.println("流程实例id:" + processInstance.getId());
  19. System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
  20.  
  21. }

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的注入配置

  1. public class CommonMethod{
  2.  
  3. public String getUserNameByUserId(int userId){
  4.  
  5. return "activiti"+userId;
  6.  
  7. }
  8.  
  9. }
  1. <bean class="cn.nfcm.po.CommonMethod" id="commonmethod"></bean>
  2.  
  3. <bean id="processEngineConfiguration"
  4. class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
  5. <!-- 数据源 -->
  6. <property name="dataSource" ref="dataSource" />
  7. <!-- activiti数据库表处理策略 -->
  8. <property name="databaseSchemaUpdate" value="true" />
  9. <!-- 可以注入多个类到activiti的beans中,其中key对应的就是我们的类名 -->
  10. <property name="beans">
  11. <map>
  12. <entry key="commonmethod" value-ref="commonmethod" />
  13. </map>
  14. </property>
  15. </bean>

3,启动一个流程实例

  1. /**
  2. * 根据方法得到值
  3. */
  4. @Test
  5. public void startProInsWithMethod(){
  6.  
  7. RuntimeService runtimeService = engine.getRuntimeService();
  8.  
  9. String processDefinitionKey = "purchasingflow";
  10. //这里设置userId为8,走到第一个节点会查找我们注入进去的commonmethod的getUserNameByUserId方法并传递userId
  11. Map<String,Object> variables = new HashMap<String, Object>();
  12. variables.put("userId", 8);
  13.  
  14. //设置流程启动时,设置参数启动
  15. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
  16. System.out.println("流程实例id:" + processInstance.getId());
  17. System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
  18.  
  19. }

到这里我们会发现流程启动成功,并且流程的当前任务处理人为acitiviti8,在实际的应用中因为都是spring管理的类,我们可以进行多种多样的查询赋值,非常方便!

(4)activiti工作流引擎之uel表达式的更多相关文章

  1. activiti工作流引擎之uel表达式

    qq讨论群:313032825本人做了一个微信公众号,用于分享各类视频学习资源和我多年学习经验,喜欢的可以关注哦! 有了前面几章,我们肯定有一定的困惑,activiti如何与实际业务整合,比如一条采购 ...

  2. Activiti工作流引擎参考资料

    Activiti工作流引擎使用 工作流-Activiti核心API介绍 传智播客Activiti工作流视频教程(企业开发实例讲解) 工作流引擎Activiti演示项目 http://www.kafei ...

  3. Activiti工作流引擎简介

    Activiti工作流引擎简介 一.概述 Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活 ...

  4. Activiti工作流引擎数据库表结构

    Activiti工作流引擎数据库表结构 一.数据库表的命名 Acitiviti数据库中表的命名都是以ACT_开头的.第二部分是一个两个字符用例表的标识.此用例大体与服务API是匹配的. ACT_RE_ ...

  5. Activiti工作流引擎开发系列

    Activiti工作流引擎开发系列-01 作者:Jesai 没有伞的孩子,只能光脚奔跑! 前言: 初次接触工作流这个概念是自从2014年11月份开始,当时是由于我的毕业设计需要,还记得当时我毕业设计的 ...

  6. activiti工作流引擎

    参考文章 Activiti-5.18.0与springMvc项目集成和activiti-explorer单独部署Web项目并与业务数据库关联方法(AutoEE_V2实现方式) https://blog ...

  7. Activiti工作流引擎使用

    http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html 1.简单介工作流引擎与Activiti 对于工作流引擎的 ...

  8. 基于Activiti工作流引擎实现的请假审核流程

    概要 本文档介绍的是某商用中集成的Activiti工作流的部署及使用,该框架用的Activiti版本为5.19.0.本文档中主要以一个请假流程为例子进行说明,该例子的流程图如下: 这是一个可以正常运作 ...

  9. Activiti工作流引擎核心介绍

    引言 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速.超稳定的 BPMN 2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更 ...

随机推荐

  1. WEB标准以及W3C的理解和认识

    web标准简单来说可以分为结构.表现和行为.其中结构主要是有HTML标签组成.表现即指css样式表,通过css可以是页面的结构标签更具美感.行为是指页面和用户具有一定的交互,同时页面结构或者表现发生变 ...

  2. 201621123010 《Java程序设计》第1周学习总结

    1. 本周学习总结 本周主要学习了五个知识点 Java是面向对象的语言 JDK,JRE,JVM的联系 javac及java指令 Java跨平台运行的原理 新概念:类,类是面向对象中的概念 2. 书面作 ...

  3. Windows 10 安装 Docker

    下载Docker For Windows 地址:https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.ex ...

  4. 20181009-5 选题 Scrum立会报告+燃尽图 04

    Scrum立会报告+燃尽图(04)选题 此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2194] 一.小组介绍 组长:刘 ...

  5. 详解UML图之类图 (转)

    原址: https://www.jianshu.com/p/4cd95d4ddb59 2.  怎么画类图?用什么工具? 使用工具:Visio或者processon在线作图 在类图中一共包含了以下几种模 ...

  6. ZetCode PyQt4 tutorial work with menus, toolbars, a statusbar, and a main application window

    !/usr/bin/python -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial This program create ...

  7. Oozie_04总结一下workflowf的运行流程【20161116】

    4.1 bin/oozie ..... 提交任务 [hadoop@hadoop01 oozie-4.0.0-cdh5.3.6]$ bin/oozie job -oozie http://hadoop0 ...

  8. POI2011题解

    POI2011题解 2214先咕一会... [BZOJ2212][POI2011]Tree Rotations 线段树合并模板题. #include<cstdio> #include< ...

  9. streamsets Executors 说明

    执行程序阶段在收到事件时触发任务.执行者不会写入或存储事件. 将执行程序用作事件流中数据流触发器的一部分,以执行事件驱动的与管道相关的任务,例如在目标关闭时移动完全写入的文件. 可以使用的execut ...

  10. JProfiler 8(一个很好的java性能监控工具) 下载和注册码

    windows x64 zip下载地址:http://download-aws.ej-technologies.com/jprofiler/jprofiler_windows-x64_8_0_1.zi ...