Activiti提供的流程定义是基于XML的,一旦发布完成后,若想对流程定义实现更改,只有一种办法,就是重新发布新的版本,但有时,我们需要的是不让他发行新版本,只是希望修改其原来的Xml,如我们对分支节点进行条件设置。
<sequenceFlow id="flow1" name="input==1" sourceRef="exclusivegateway1" targetRef="usertask1"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[input==1]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow2" name="input==2" sourceRef="exclusivegateway1" targetRef="usertask2"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[input==2]]></conditionExpression> </sequenceFlow>
在这里,我们提出了一种新的做法,就是绕开Activiti的API,直接实现实现对流程定义的XML实现读写,读写比较简单,只需要拿到流程定义的deployId或definitionId,通过对其act_ge_bytearray表实现更改,其定义内容存放于bytes_字段中。
我们提供了对定义Xml文件的更改方法:
public class ActGeByteArrayDao { @Resource JdbcTemplate jdbcTemplate; /** * 取得流程定义的XML * * @param deployId * @return */ public String getDefXmlByDeployId(String deployId){ String sql = "select a.* from ACT_GE_BYTEARRAY a where NAME_ LIKE '%bpmn20.xml' and DEPLOYMENT_ID_= ? "; final LobHandler lobHandler = new DefaultLobHandler(); // reusable final ByteArrayOutputStream contentOs = new ByteArrayOutputStream(); String defXml = null; try{ jdbcTemplate.query(sql, new Object[]{deployId },new AbstractLobStreamingResultSetExtractor<Object>(){ public void streamData(ResultSet rs) throws SQLException, IOException{ FileCopyUtils.copy(lobHandler.getBlobAsBinaryStream(rs, "BYTES_"), contentOs); } } ); defXml = new String(contentOs.toByteArray(), "UTF-8"); } catch (Exception ex){ ex.printStackTrace(); } return defXml; } /** * 把修改过的xml更新至回流程定义中 * * @param deployId * @param defXml */ public void writeDefXml(final String deployId, String defXml) { try { LobHandler lobHandler = new DefaultLobHandler(); final byte[] btyesXml = defXml.getBytes("UTF-8"); String sql = "update ACT_GE_BYTEARRAY set BYTES_=? where NAME_ LIKE '%bpmn20.xml' 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, deployId); } }); } catch (Exception ex) { ex.printStackTrace(); } } }
但要注意,流程定义发布后,若你使用了该流程,其就会在缓存中缓存了流程定义的解析后的对象,供整个引擎使用,这时你更改了流程定义的XML后,那份缓存并没有实现了更改,因此,需要告诉引擎,让他清空缓存中的该流程定义即可。如何清空流程定义的缓存,请参考以下代码:
((ProcessEngineConfigurationImpl)processEngineConfiguration).getProcessDefinitionCache().remove(actDefId);
通过以上方式,可以灵活实现对流程定义的节点及属性的随意更改,而不会限制于Activiti的API.
后续我会提供更加灵活活的流程属性扩展,如流程定义的节点属性,人员配置,事件回调,脚本执行的配置。除了通过更新流程定义的XML配置外,还可以通过流程定义本身提供的一些功能,如监听器,事件来调用这些配置,从而实现执行。
以下为参考的实现模式:
实现的效果如下所示:
http://www.redxun.cn:8020/saweb/login.jsp
相关推荐
Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于Java的超快速、超...
02 - Activiti流程定义 1.流程定义添加(部署) 1.Classpath加载方式; 2.Zip加载方式; 2.流程定义查询 1.查询流程定义; 2.查询某个流程定义的流程设计图片; 3.查询最新版本的流程定义集合; 3.流程定义...
Activiti是一个工作流引擎, activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由activiti进行管理,减少业务系统由于...
Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速、超...
首先当运行:deploy()部署流程定义方法,在数据库中流程定义表会发生一些变化新增了一条数据, act_re_deployment流程定义部署表: 然后act_re_prodef流程定义表也会有一条数据插入: 还有一个act_ge_bytearray...
1. 简介 协议 下载 源码 必要的软件 ...内部实现类 ...安装Activiti ...安装Activiti数据库 ...引入Activiti jar和依赖 ...为流程定义添加监听器 通过API分发事件 支持的事件类型 附加信息 4. Activiti API......
排它网关: 内部是一个“X”图标,用来在流程中实现决策。 当流程执行到这个网关,所有外出顺序流都会被处理一遍。 其中条件解析为true的顺序流会被选中,让流程继续运行。 并行网关: 内部是一个“加号”图标。它...
Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于Java的超快速、超...
Activiti6最大的变化点就是对代码进行了重构,该版本修复以往的Bug并不多,但内部实现相对来说变化比较大。其突出的变化如下所示: 新增两款新引擎,Form引擎和DMN引擎(动态引擎)。其中DMN引擎允许开发人员创建...
OpenWebFlow完全实现了与流程定义时期的解耦,即用户对活动的访问控制信息单独管理(而不是在流程定义中预先写死),这样有利于动态调整权限,详见自定义活动权限管理;完全接管了Activiti对用户表(IDENTITY_XXX表...
eclipse 流程插件离线安装包和...Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),可以定义流程、执行流程并以不同方式对其实现运行。
实战篇(5~14章)系统讲解了Activiti的用法、技巧和最佳实践,包含流程定义、流程实例、任务、子流程、多实例、事件以及监听器等;高级篇(15~21)通过集成WebService、规则引擎、JPA、ESB等各种服务和中间件来阐述...
实战篇(5~14章)系统讲解了Activiti的用法、技巧和最佳实践,包含流程定义、流程实例、任务、子流程、多实例、事件以及监听器等;高级篇(15~21)通过集成WebService、规则引擎、JPA、ESB等各种服务和中间件来阐述...
实战篇(5~14章)系统讲解了Activiti的用法、技巧和最佳实践,包含流程定义、流程实例、任务、子流程、多实例、事件以及监听器等;高级篇(15~21)通过集成WebService、规则引擎、JPA、ESB等各种服务和中间件来阐述...
3.18.4. 为流程定义增加监听器 Adding listeners to process definitions 执行用户定义逻辑的监听器 Listeners executing userdefined logic 抛出BPMN事件的监听器 Listeners throwing BPMN ...
实战篇(5~14章)系统讲解了Activiti的用法、技巧和最佳实践,包含流程定义、流程实例、任务、子流程、多实例、事件以及监听器等;高级篇(15~21)通过集成WebService、规则引擎、JPA、ESB等各种服务和中间件来阐述...
实战篇(5~14章)系统讲解了Activiti的用法、技巧和最佳实践,包含流程定义、流程实例、任务、子流程、多实例、事件以及监听器等;高级篇(15~21)通过集成WebService、规则引擎、JPA、ESB等各种服务和中间件来阐述...
能学到什么:①学习Activity7本身的流程定义、部署、任务、执行等底层工作原理及设计思路及使用;②结合实际业务流程与Activity7整合,完成流程全自动化。 阅读建议:此资源以开发简单的人力资源系统,学习Activity...