Activiti实现流程定义的控制与修改
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实现流程定义的控制与修改相关推荐
- Activiti——管理流程定义(四)
Activiti--管理流程定义 1.设计流程定义文档 1.1.流程图 1.2.bpmn文件 <?xml version="1.0" encoding="UTF-8 ...
- Activiti的流程定义文件解析
2019独角兽企业重金招聘Python工程师标准>>> 在实现流程的模拟运行时,需获取流程定义中的相关活动节点信息,故需对流程定义文件进行解析. 此处对流程定义文件的解析,主要是通过 ...
- Spring中部署Activiti流程定义的三种姿势
摘要:本文对工作流Activiti框架中流程定义的部署进行了详细说明介绍. 本文分享自华为云社区<项目中工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势>,作者:攻 ...
- Activiti流程定义缓存源码分析5-流程缓存
谈起节点缓存,可能读者有个疑问,缓存节点的意义何在,哪些节点支持缓存呢?需要在哪里配置节点缓存值呢?节点缓存的数据格式又是什么呢?首先我们有一种常见的应用场景,比如我们定义流程文档的时候,通常任务节点 ...
- JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成
管理流程定义 设计流程定义文档 bpmn文件 设置方式可以直接使用插件图形化界面进行设置 为某任务节点指定任务执行者 保存后的BPMN文件可以使用XML编辑器打开 BPMN 2.0根节点是defini ...
- activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
注:(1)环境搭建:activiti自己定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自己定义流程之Spr ...
- Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
tags: Activiti 上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]... 管理流程定义 管理流程定义主要涉及到以下的4张表 ...
- activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自定义流程之Sprin ...
- activiti删除已经部署的流程定义
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.acti ...
- activiti流程定义的部署
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.acti ...
最新文章
- TypeScript interface
- 有关SwfUpLoad的2038 错误
- java语言的多态性及特点_Java中的方法的多态性有两种形式:( )和( )。_学小易找答案...
- 系统重装 如何转换GPT的磁盘格式为MBR或者反过来
- JQ和Js获取span标签的内容
- Git的学习与使用(五)——Git 创建仓库
- 《塞尔达传说:旷野之息》技术分析:神作是怎么炼成的
- 安卓手机突然很卡_你的安卓手机越来越卡?教你4招轻松解决问题!
- FireUIPagedScrollView
- 一个以标签为特色的社交网站——易寻
- linux下pwd命令学习
- liunx 环境-配置docker阿里云镜像加速
- MacBook Pro 如何删除多余专注模式?
- (转)中国大学改名大全2007最新版(笑掉大牙)
- 300 页干货!李宏毅《一天搞懂深度学习》(附下载)
- Power Query 系列 (06) - M 语言结构化数据类型
- 本科计算机专业考北大软微,2019北大软微计算机867高分经验分享
- RxSwift系列—RxSwift核心逻辑
- 麦克风有突突突的杂音
- mysql的interval()引出的
热门文章
- 【第十届“泰迪杯”数据挖掘挑战赛】C题:疫情背景下的周边游需求图谱分析 赛后总结、46页论文及代码
- 如何将问卷中的矩阵题转换成SPSS可以分析的数据
- Linux的tar解压命令
- nutch2.3.1 mysql_Nutch-NewsClassify
- Google 地球专业版离线下载
- 图文并茂全面总结上百个Android Studio好用的插件(IDE通用)
- 第十二章 Android第三方库源码
- 遭遇 kapjazy.dll,yhpri.dll,WinSys64.Sys,nwiztlbu.exe,myplayer.com 等1
- ib网卡命令_InfiniBand 网卡测试
- 安全漏洞防御(1)如何防止被拖库