Activiti实现流程定义的控制与修改
来源:互联网 发布:php调用服务器exe程序 编辑:程序博客网 时间:2024/06/11 20:56
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 查询最新版本的流程定义
- Activiti 工作流 流程定义的删除 04
- activiti实现的请假流程
- Activiti 流程定义实例
- Activiti流程定义查询
- Activiti流程定义删除
- activiti 查询流程定义
- activiti 删除流程定义
- Activiti流程定义查询
- Activiti流程定义部署
- Activiti 流程定义实例
- activiti流程定义部署。
- activiti 流程定义和流程实例的挂起
- 扩展Activiti流程定义文件,实现自定义节点属性
- activiti 流程定义(二)
- Activiti(三)流程定义
- MVP
- LUA 排序算法和性能分析[2]:冒泡排序算法
- 前后端分离开发背景下,前端如何使用nginx代理转发ajax跨域访问后台服务?
- HTTP Status 500
- 漏洞真实影响分析,终结网络安全的“狼来了”困境
- Activiti实现流程定义的控制与修改
- 如何判断一个String字符串不为空
- 关于二叉树创建时遇到的问题的解决
- 初学者---Android 接口回调
- Apsara Clouder大数据专项技能认证:共享单车骑行分析
- gradle 区分debug和realse自动化打包
- 服务器返回状态码
- Ubuntu14.0.4 配置ftp服务器
- jsp页面老提示Multiple annotations found at this line: