Activiti提供的流程定义是基于XML的,一旦发布完成后,若想对流程定义实现更改,只有一种办法,就是重新发布新的版本,但有时,我们需要的是不让他发行新版本,只是希望修改其原来的Xml,如我们对分支节点进行条件设置。

此文章借鉴了http://redxun.iteye.com/blog/2253074这篇博主的文章,但是他的方法并不能完全实现对流程的修改。在此,我经过改造现将实现过程写下:

直接实现实现对流程定义的XML实现读写。只需要拿到流程定义的deployId或definitionId,通过对其act_ge_bytearray表实现更改,其定义内容存放于bytes_字段中。

我们提供了对定义Xml文件的更改方法:

private String modifyDeployId(Document doc) {
// TODO 手动修改流程定义

String deploymentId=Xml2Bean.selectElementText(doc, "//ContractRoot/SvcCont/ReqInfo/deploymentId");
String actDefId = Xml2Bean.selectElementText(doc, "//ContractRoot/SvcCont/ReqInfo/actDefId");
String deployNames=Xml2Bean.selectElementText(doc, "//ContractRoot/SvcCont/ReqInfo/deployNames");

//把修改过的xml更新至回流程定义中 
        writeDefXml(deploymentId,deployNames);
        //清除缓存
        //String actdefId = "AREA_INTERNET_STATIC:2:697504";
        engineConfig.getProcessDefinitionCache().remove(actDefId);  
String respXml="<ContractRoot>"+ 
"<TcpCont>" + 
"<ResultCode>0</ResultCode>" + 
"<deploymentId>部署对象ID为"+deploymentId+" </deploymentId>" + 
"<actDefId>流程定义ID为"+actDefId+" </actDefId>" +
"</TcpCont>"+
"<ContractRoot>";
return respXml;
}

//取得流程定义的XML

private byte[] getDefXml(String deployNames) throws IOException{

InputStream in = BusiBizImpl.class.getResourceAsStream(deployNames);
        BufferedInputStream bis =null;
        ByteArrayOutputStream bos = null;
        try{
        bis =new BufferedInputStream(in);
        bos = new ByteArrayOutputStream();
        int buf_size = 1024;
        byte[] buffer = new byte[buf_size];
        int len;
        while(-1 !=(len = bis.read(buffer,0, buf_size))){
        bos.write(buffer, 0, len);
        }
        byte[] result =  bos.toByteArray();
        return result;
        } finally{
        if(bis != null)
        bis.close();
        if(bos != null)
        bos.close();
        }
}
public void writeDefXml(final String deploymentId, String deployNames) {  
        try {  
            LobHandler lobHandler = new DefaultLobHandler();  
            final byte[] btyesXml = getDefXml("/activity/" + deployNames);
            String sql = "update ACT_GE_BYTEARRAY set BYTES_=? where NAME_ LIKE '%.bpmn' and DEPLOYMENT_ID_= ? ";  
            jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(lobHandler) {  
                @Override  
                protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException, DataAccessException {  
                    lobCreator.setBlobAsBytes(ps, 1, btyesXml);  
                    ps.setString(2, deploymentId);  
                }  
            });  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
    }

修改前:

这个流程已经上生产了,本次修改了会签节点的属性,红色下划线是已经修改好的,由图可见:本地流程已经更新。

数据库的XML文件:更新前:

更新后:

成功修改,无需从新发布流程!

测试方法:

1:在项目中修改Activiti的流程图,此时XML文件已经更新。

2:在act_re_procdef   表中找到需要修改的流程,这里注意是最新版本的流程定义。 取到部署对象ID、流程定义ID、bpmn格式的流程名称。

3::调用接口。实现更新

接触工作流有一段时间了,一直没时间更新博客。如有碰到Activiti方面的问题,欢迎各位朋友共同学习进步。如有疑问,可通过163邮箱联系我:uuid0717@163.com

Activiti实现流程定义的控制与修改相关推荐

  1. Activiti——管理流程定义(四)

    Activiti--管理流程定义 1.设计流程定义文档 1.1.流程图 1.2.bpmn文件 <?xml version="1.0" encoding="UTF-8 ...

  2. Activiti的流程定义文件解析

    2019独角兽企业重金招聘Python工程师标准>>> 在实现流程的模拟运行时,需获取流程定义中的相关活动节点信息,故需对流程定义文件进行解析. 此处对流程定义文件的解析,主要是通过 ...

  3. Spring中部署Activiti流程定义的三种姿势

    摘要:本文对工作流Activiti框架中流程定义的部署进行了详细说明介绍. 本文分享自华为云社区<项目中工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势>,作者:攻 ...

  4. Activiti流程定义缓存源码分析5-流程缓存

    谈起节点缓存,可能读者有个疑问,缓存节点的意义何在,哪些节点支持缓存呢?需要在哪里配置节点缓存值呢?节点缓存的数据格式又是什么呢?首先我们有一种常见的应用场景,比如我们定义流程文档的时候,通常任务节点 ...

  5. JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成

    管理流程定义 设计流程定义文档 bpmn文件 设置方式可以直接使用插件图形化界面进行设置 为某任务节点指定任务执行者 保存后的BPMN文件可以使用XML编辑器打开 BPMN 2.0根节点是defini ...

  6. activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义

    注:(1)环境搭建:activiti自己定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建         (2)创建流程模型:activiti自己定义流程之Spr ...

  7. Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】

    tags: Activiti 上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]... 管理流程定义 管理流程定义主要涉及到以下的4张表 ...

  8. activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建         (2)创建流程模型:activiti自定义流程之Sprin ...

  9. activiti删除已经部署的流程定义

    import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.acti ...

  10. activiti流程定义的部署

    import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.acti ...

最新文章

  1. TypeScript interface
  2. 有关SwfUpLoad的2038 错误
  3. java语言的多态性及特点_Java中的方法的多态性有两种形式:( )和( )。_学小易找答案...
  4. 系统重装 如何转换GPT的磁盘格式为MBR或者反过来
  5. JQ和Js获取span标签的内容
  6. Git的学习与使用(五)——Git 创建仓库
  7. 《塞尔达传说:旷野之息》技术分析:神作是怎么炼成的
  8. 安卓手机突然很卡_你的安卓手机越来越卡?教你4招轻松解决问题!
  9. FireUIPagedScrollView
  10. 一个以标签为特色的社交网站——易寻
  11. linux下pwd命令学习
  12. liunx 环境-配置docker阿里云镜像加速
  13. MacBook Pro 如何删除多余专注模式?
  14. (转)中国大学改名大全2007最新版(笑掉大牙)
  15. 300 页干货!李宏毅《一天搞懂深度学习》(附下载)
  16. Power Query 系列 (06) - M 语言结构化数据类型
  17. 本科计算机专业考北大软微,2019北大软微计算机867高分经验分享
  18. RxSwift系列—RxSwift核心逻辑
  19. 麦克风有突突突的杂音
  20. mysql的interval()引出的

热门文章

  1. 【第十届“泰迪杯”数据挖掘挑战赛】C题:疫情背景下的周边游需求图谱分析 赛后总结、46页论文及代码
  2. 如何将问卷中的矩阵题转换成SPSS可以分析的数据
  3. Linux的tar解压命令
  4. nutch2.3.1 mysql_Nutch-NewsClassify
  5. Google 地球专业版离线下载
  6. 图文并茂全面总结上百个Android Studio好用的插件(IDE通用)
  7. 第十二章 Android第三方库源码
  8. 遭遇 kapjazy.dll,yhpri.dll,WinSys64.Sys,nwiztlbu.exe,myplayer.com 等1
  9. ib网卡命令_InfiniBand 网卡测试
  10. 安全漏洞防御(1)如何防止被拖库