文档章节

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

李玉珏
 李玉珏
发布于 2015/03/02 17:18
字数 597
阅读 4183
收藏 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);
            }
        }
      }
}

 

© 著作权归作者所有

共有 人打赏支持
李玉珏

李玉珏

粉丝 318
博文 66
码字总数 110992
作品 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
2018/06/17
0
0
基于Activiti扩展的工作流引擎OpenWebFlow

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

白乔
2017/10/18
0
9
activiti开发笔记

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

之渊
2016/09/21
33
0
activiti-ScriptTask(脚本任务)

Activiti脚本任务(ScriptTask) Activiti脚本任务(ScriptTask) 作者:邓家海 你一直问为什么到不了远方,请停下数数你的脚步,是不是还没迈开腿 对于没有接触过groovy脚本语言的人来说,可...

方宏春
2018/04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

传统IDC部署网站(三)

11. 重置密码 密钥和密码都支持远程登陆, 二选一 两个都可以登陆, 密钥相对于密码来说,相对安全一点 本地登陆无法是用密钥 修改密码 root 用户 passwd root 修改普通用户 passwd usernam...

miko0089
4分钟前
0
0
日志服务与SIEM(如Splunk)集成方案实战

背景信息 目标 本文主要介绍如何让阿里云日志服务与您的SIEM方案(如Splunk)对接, 以便确保阿里云上的所有法规、审计、与其他相关日志能够导入到您的安全运维中心(SOC)中。 名词解释 LOG(S...

阿里云官方博客
8分钟前
0
0
bash特性

1.支持别名 alias 2.命令替换 $(COMMANS) 或者 `COMMAND` 3. bash支持的引号: `` :命令替换 "":弱引用,可以实现变量替换 '':强引用,不实现变量替换 4.文件名通配 globbing: * : 任意长...

忙碌的小蜜蜂
13分钟前
0
0
以语音评测的PC端demo代码为例,讲解口语评测如何实现

本文由云+社区发表 作者:腾讯智慧教育 概述 腾讯云智聆口语评测(英文版)(Smart Oral Evaluation-English,SOE-E)是腾讯云推出的语音评测产品,是基于英语口语类教育培训场景和腾讯云的语...

腾讯云加社区
25分钟前
0
0
浅谈SpringMVC之DispatcherServlet

Spring的MVC框架是围绕一个DispatcherServlet其实就是个Servlet(它继承自HttpServlet基类)来设计的, 它支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染、文件上传等 控制器一般...

恋码之子
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部