Activiti 6.0 之SkipExpression

惭愧惭愧,这么一个小小的功能整了这么久。

​ 还是先说一下业务场景吧。在工作流中,我们难免会遇到这样的情况,即一个流程的发起者的身份问题。举个详细的例子。就拿一个公司的报销流程来讲。可能是这样的。

  1. 没有优化过的流程图(实在不想画了,太费劲了)

  2. 优化过的流程图

    ​ 怎么样?看起来是不是清爽了很多?那怎么执行呢?首先,这篇说的是SkipExpression,所以审批不通过的驳回不在这篇说。


  1. 流程启动之后,第一个任务节点就是发起任务的节点。

  2. 在后续任务中加入一个跳过表达式,比如说代表当前用户的职责组编号:${execution.getVariable('gId')==2}

    之后就可以部署流程图了。在任务进行的途中将当前处理人的身份组ID以流程变量的形式设置进流程,这样就可以做到任务执行到当前任务时自动跳过任务了。嗯。理想是美好的,现实是骨感的,WTF!!!Skip Expression竟然没有工作????

Question:Skip Expression 设置了但是没有起作用

​ 哎,上面的想法是好的,因为看到了Skip Expression,顾名思义,就是跳过表达式的意思嘛,怎么就不起作用呢?好在在github中下载了一份源码来看。

​ 在源码的测试方法中可以看到在设置流程变量前先设置了一个这东西:_ACTIVITI_SKIP_EXPRESSION_ENABLED

​ 什么玩意???Activiti 跳过 表达式 开启?咦,英语还凑合哈,对就是启用跳过表达式模式。那么问题又来了。怎么呢??这么多的任务节点,你让我每次都去加这么一句流程变量么??!!闹呢??别急,我是这样做的。

给第一个需要跳过的任务中也添加一个ExecutionListener

import com.edu.hart.modules.constant.ActivitiConstanct;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener; import java.util.Map; /**
* 任务跳过监听器
* <p>
* create by 叶云轩 at 2017/12/26 - 16:03
* contact by ycountjavaxuan@outlook.com
*/
public class SkipListenner implements ExecutionListener { /**
* 序列化
*/
private static final long serialVersionUID = 3599293834301636975L; @Override
public void notify(DelegateExecution execution) {
// 获取流程变量
Map<String, Object> variables = execution.getVariables();
// 开启支持跳过表达式 ActivitiConstanct.getSkipExpression()就是"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
variables.put(ActivitiConstanct.getSkipExpression(), true);
// 将修改同步到流程中
execution.setTransientVariables(variables);
// 这种方式也行。直接设置流程变量
// execution.setVariable(ActivitiConstanct.getSkipExpression(),true);
}
}

之后在process的properties中设置Listeners

这样就可以了,亲测可行的哦~~~~


总结:

1. 看源码不认真,注意到_ACTIVITI_SKIP_EXPRESSION_ENABLED了但是没有用,就去测试了。最后结果不行,又来看源码。浪费时间。
2. Activiti还是很好用的~~~~
3. 下章写驳回的实现逻辑,完成任意节点的驳回,即去掉所有的审批网关。精简设计和开发。

Activiti 6.0 之SkipExpression的更多相关文章

  1. springboot2.04与activiti 6.0集成

    本文就不对activiti做解释,下面直接看项目集成 以下顺序方面根据我的理解来,可以先从第二章看,再看第一张与第三章 增加activiti表的API,备注用. 目录 一.springboot2.X集 ...

  2. IDEA环境Spring Boot 2.3整合Activiti 6.0,启动项目初始化表并创建核心服务

    如下步骤照着抄就完事了. 一.新建一个spring boot项目,并引入相关依赖 <?xml version="1.0" encoding="UTF-8" ...

  3. Activiti 6.0 入门篇

    从Activiti网站下载Activiti UI WAR文件(或百度云) 将下载的activiti-app.war复制到Tomcat的webapps目录. 启动Tomcat 打开浏览器并转到 http ...

  4. Activiti6.0 安装出错 log4j:ERROR setFile(null,true) call failed.

    由于要选择一款合适的流程引擎,需要在jbpm和Activiti之间做对比,我这边负责Activiti的测试. 看到Activiti官网(http://www.activiti.org/download ...

  5. 工作流学习——Activiti整体认识二步曲 (zhuan)

    http://blog.csdn.net/zwk626542417/article/details/46594505 ***************************************** ...

  6. Activiti工作流的定义部署和执行

        工作流引擎 个人觉得直接理解工作流引擎概念有点难度,我们可以先通过了解工作流引擎的职责再反过来理解工作流引擎,工作流引擎一般都做两件事情: 1.定义流程,也就是给我们提供某种规范来定义规则,以 ...

  7. Activiti - 新一代的开源BPM引擎

    Activiti 背景简介.服务和功能介绍 背景介绍 Activiti 其核心是 BPMN 2.0 的流程引擎.BPMN 是目前被各 BPM 厂商广泛接受的 BPM 标准,全称为 Business P ...

  8. Activiti - 新一代的开源 BPM 引擎 (zhuan)

    http://www.ibm.com/developerworks/cn/Java/j-lo-activiti1/ ****************************************** ...

  9. Activiti工作流学习之流程图应用详解

    Activiti工作流学习之流程图应用详解 1.目的  了解Activiti工作流是怎样应用流程图的. 2.环境准备2.1.相关软件及版本    jdk版本:Jdk1.7及以上 IDE:eclipse ...

随机推荐

  1. wealoha thrift-client-pool 总结

    DefaultEvictionPolicy类是EvictionPolicy接口的实现主要描述,pool中那些idel对象会被Evict,回收.关键代码如下: public boolean evict( ...

  2. 转载:Allegro实用技巧之模块复用

    http://bbs.ednchina.com/BLOG_ARTICLE_3031842.HTM?click_from=8800032437,9950148743,2016-01-04,EDNCOL, ...

  3. HTML5 Web缓存&运用程序缓存&cookie,session

    在介绍HTML5 web缓存前,来认识一下cookie和session: session: 由于HTTP是无状态的,你是谁?你干了什么?抱歉服务器都是不知道的. 因此session(会话)出现了,它会 ...

  4. JSF页面中使用js函数回调后台action方法

    最近遇到了一个问题就是在JSF页面中嵌入html页面,这个html页面中很多功能是使用js动态生成的,现在需要在js函数里想去调用JSF中action类method()方法并动态传送数据给后台进行处理 ...

  5. eclipse搭建maven ssm项目

    file --> new --> maven project -->创建个简单的maven项目 会报错,没事 右键 properties 先去掉,然后再勾上 接下来配置maven的相 ...

  6. JavaEE中的MVC(一)Dao层彻底封装

    最近Android工作实在难找,考虑是不是该转行做Java了,今天开始,花几天的事件,研究一下JavaEE各层优化. 首先是Dao层 增删改方法封装 使用PreparedStatement执行一条Sq ...

  7. 在JQuery中如何获取当前时间?

    ////发表时间(now) function p(s) { return s < 10 ? '0' + s : s; } var myDate = new Date(); //获取当前年 var ...

  8. Django的分页器(paginator)

    先导入模块: from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 分页器paginator 下面的所有方法 ...

  9. Java爬虫实践--爬取CSDN网站图片为例

    实现的效果,自动在工程下创建Pictures文件夹,根据网站URL爬取图片,层层获取.在Pictures下以网站的层级URL命名文件夹,用来装该层URL下的图片.同时将文件名,路径,URL插入数据库, ...

  10. Wannafly挑战赛3 record

    B 遇见 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 65536K,其他语言131072K64bit IO Format: %lld题目描述A和B在同一条路上,他们之间的距离为 k ...