文档章节

Activiti流程历史中活动名支持JUEL表达式的方法

李玉珏
 李玉珏
发布于 2015/03/02 17:18
字数 597
阅读 3899
收藏 5

        Activiti中,任务名是支持JUEL表达式的,但是当任务执行完毕保存到流程历史表中时,这里的活动名又不支持表达式了,他会把表达式字符串保存到表中,这个说来应该是Bug。

        能解决么?下一步,就是研究Activiti的代码了,看看能不能找到相应的扩展点,解决这个问题。

        经过研究,找到了扩展点,开发起来还是比较方便的,下面进行详细描述,注意,本文的开发基于Activiti5.15.1版本,大体扫了下代码,更新的5.17版本也有这个问题,但未经过测试。

        Activiti中流程的历史信息保存在ACT_HI_ACTINST表中,对于任务执行完毕时保存ACT_HI_ACTINST表的代码,在DefaultHistoryManager类的 recordActivityStart方法中,所以我们只要想办法继承这个类,然后覆写这个方法即可,而 DefaultHistoryManager的创建,是在DefaultHistoryManagerSessionFactory中,而 DefaultHistoryManagerSessionFactory的初始化,是在ProcessEngineConfigurationImpl 中的initSessionFactories方法,找到这里,思路已经非常清晰了,需要写的代码没有多少。

        一、扩展 ProcessEngineConfigurationImpl,如果使用Spring集成的话,继承 SpringProcessEngineConfiguration类,覆写initSessionFactories方法,在该方法中调用 addSessionFactory方法添加新的自定义DefaultHistoryManagerSessionFactory;

        二、扩展DefaultHistoryManagerSessionFactory,覆写openSession方法,在该方法中创建新的DefaultHistoryManager;

        三、扩展DefaultHistoryManager,覆写recordActivityStart方法,这里的关键是获取表达式的解析器,然后解析即可;

    具体代码如下所示:

import org.activiti.spring.SpringProcessEngineConfiguration;

public class ProcessEngineConfiguration extends SpringProcessEngineConfiguration {

    @Override
    protected void initSessionFactories() {
        super.initSessionFactories();
        super.addSessionFactory(new ProcessHistoryManagerSessionFactory());
    }
}

    

import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.DefaultHistoryManagerSessionFactory;

public class ProcessHistoryManagerSessionFactory extends DefaultHistoryManagerSessionFactory {

    @Override
    public Session openSession() {
        return new ProcessHistoryManager();
    }
}

    

public class ProcessHistoryManager extends DefaultHistoryManager {
    public void recordActivityStart(ExecutionEntity executionEntity) {
        if(isHistoryLevelAtLeast(HistoryLevel.ACTIVITY)) {
            if(executionEntity.getActivity() != null) {
                IdGenerator idGenerator = Context.getProcessEngineConfiguration().getIdGenerator();
                
                String processDefinitionId = executionEntity.getProcessDefinitionId();
                String processInstanceId = executionEntity.getProcessInstanceId();
                String executionId = executionEntity.getId();
                
                HistoricActivityInstanceEntity historicActivityInstance = new HistoricActivityInstanceEntity();
                historicActivityInstance.setId(idGenerator.getNextId());
                historicActivityInstance.setProcessDefinitionId(processDefinitionId);
                historicActivityInstance.setProcessInstanceId(processInstanceId);
                historicActivityInstance.setExecutionId(executionId);
                historicActivityInstance.setActivityId(executionEntity.getActivityId());
                
                ExpressionManager expressionManager = Context.getProcessEngineConfiguration().getExpressionManager();
                Expression exp = expressionManager.createExpression((String) executionEntity.getActivity().getProperty("name"));
                
                historicActivityInstance.setActivityName((String)exp.getValue(executionEntity));
                historicActivityInstance.setActivityType((String) executionEntity.getActivity().getProperty("type"));
                historicActivityInstance.setStartTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime());
                
                // Inherit tenant id (if applicable)
                if (executionEntity.getTenantId() != null) {
                    historicActivityInstance.setTenantId(executionEntity.getTenantId());
                }
                
                getDbSqlSession().insert(historicActivityInstance);
            }
        }
      }
}

 

© 著作权归作者所有

共有 人打赏支持
李玉珏

李玉珏

粉丝 271
博文 58
码字总数 94783
作品 0
沈阳
技术主管
activiti 中的一些信息

activiti 中的service script task 执行脚本任务(java自身脚本不在此列 如需关注看 javaservice) scriptFormat : 1. javascript(JDK 自带的脚步解析特性) 虽然早就知道 但是还未去看过 2. g...

triankg
2015/02/15
0
0
带你进入 Activiti 工作流的世界

Activiti 是一个针对企业用户、开发人员 、系统管理员的轻量级工作流业务管理平台,其核心是使用 java 开发的快速 、 稳定的 BPMN2.0 流程引擎 。它可以与 spring 完美集成。 创始人 Tom Ba...

deniro
06/17
0
0
activiti开发笔记

actgebytearray 多个对1个 actredeployment 数据库说明: ACTRE* RE 表示 repository . 这个前缀表包含了流程定义 和流程静态资源(图片,规则等等) ACTRU* RU表示 runtime 这些运行时的表,...

之渊
2016/09/21
33
0
基于Activiti扩展的工作流引擎OpenWebFlow

开源地址:https://github.com/bluejoe2008/openwebflow(欢迎star) 1. OpenWebFlow概述 OpenWebFlow是基于Activiti扩展的工作流引擎。Activiti (官方网站http://activiti.org/,代码托管在...

白乔
2017/10/18
0
9
Activiti工作流实战-3

数据库(先了解后看) Activiti数据库支持: Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。 ACTRE*: ‘RE’表示...

帅的不像男的
2016/07/01
219
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[MicroPython]STM32F407开发板驱动OLED液晶屏

1.实验目的 1.学习在PC机系统中扩展简单I/O 接口的方法。 2.进一步学习编制数据输出程序的设计方法。 3.学习 F407 Micropython开发板控制OLED显示字符。 2.所需元器件 F407 Micropython开发板...

bodasisiter
34分钟前
0
0
php require和include 相对路径一个有趣的坑

以前总是被教育,不要使用相对路径,这样性能比较差,但是相对路径的问题不仅仅是性能哦,看下面这里例子 这是项目结构 .├── main.php├── t│ ├── t1.php│ └── t2.php└─...

anoty
35分钟前
17
0
x64技术之SSDT_Hook

测试环境: 虚拟机: Windows 7 64bit 过PG工具 驱动加载工具 PCHunter64 系统自带的计算器和任务管理器等 实现思路: 实际思路与win32的思路一样.都是替换SSDT表里边的函数地址.不过微软被搞怕...

simpower
36分钟前
0
0
TreeMap源码分析,看了都说好

一、简介 TreeMap最早出现在JDK 1.2中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于红黑树实现,可保证在log(n)时间复杂度内完成 containsKey、get、put 和 remove 操作,效率很...

Java小铺
46分钟前
0
0
协变、逆变

概念 假设 A、B表示类型 ≤ 表示继承关系 f<⋅>表示类型转换 若A ≤ B,则 A是B的子类,B是A的超类 协变、逆变 什么是型变?型变(type variance)允许对类型进行子类型转换。 为了下面讲解先...

obaniu
52分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部