`
redxun
  • 浏览: 298376 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

如何实现Activiti的流程定义的设置

 
阅读更多

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

 

 

 

  • 大小: 28.7 KB
6
1
分享到:
评论

相关推荐

    Activiti12流程跟踪任务节点和线高亮显示

    Activiti流程跟踪任务节点和线高亮显示的实现原理是基于Activiti的流程引擎和RepositoryService。流程引擎提供了流程实例的管理和执行功能,而RepositoryService提供了流程定义的管理和存储功能。通过...

    activiti流程图查看demo

    在HTML页面中引入diagram-viewer的相关库,并设置合适的参数,如流程定义的ID,来加载流程图。 4. **交互功能**:diagram-viewer不仅展示流程图,还可能提供交互功能,如节点高亮、流程路径追踪等,以帮助理解流程...

    Activiti流程图部署及流程图部分操作.pdf

    总之,Activiti流程图的部署和操作涉及到流程定义的生命周期管理,包括创建、部署、查询和更新等步骤。正确地部署和操作流程图能够确保业务流程在系统中按照预期执行,从而提升企业的运营效率和自动化水平。熟悉并...

    activiti6.0实现流程图片自定义颜色 当前任务为红色,走过的任务为绿色,自定义文字颜色连线文字显示

    在IT行业中,Activiti是一个非常流行的开源工作流引擎,它被广泛用于企业级应用中来管理业务...总的来说,自定义流程图颜色是Activiti流程管理中一个实用且有价值的特性,它让复杂的业务流程变得更加生动和易于追踪。

    Activiti学习笔记三:管理流程定义

    在“Activiti学习笔记三:管理流程定义”中,我们将深入探讨如何使用Activiti来管理和操作流程定义。 首先,流程定义是Activiti中的核心概念,它是流程模型的静态表示,描述了工作流的结构和规则。流程定义通常以...

    Activiti5学习-activiti流程图中文乱码

    Activiti是一个基于Java的BPMN 2.0标准实现,它可以解析流程定义文件(通常是 BPMN XML 文件),并能够动态地运行这些流程。流程图是流程定义的一部分,它们通常以图像的形式显示,以便用户可以直观地理解流程的走向...

    Activiti流程演示Demo

    - **部署流程**:将流程定义XML文件部署到Activiti流程引擎。 - **启动流程实例**:通过Runtime Service启动流程实例,并可能传入初始变量。 - **处理任务**:通过Task Service进行任务的操作,如查询、领取、...

    Activiti工作流之管理流程定义

    综上所述,Activiti提供了全面的流程管理解决方案,通过其强大的流程定义、部署、执行和监控功能,企业能够实现高效且灵活的业务流程自动化。结合源码理解和相关工具的使用,开发者可以更深入地掌握和定制Activiti,...

    activiti工作流高亮图配置.zip

    解压并研究这些文件,可以更深入地了解如何在实际项目中配置和实现Activiti流程图的高亮显示。具体步骤可能包括导入流程定义、配置高亮规则、编写前端展示代码等。 总结来说,配置Activiti流程图的高亮显示需要理解...

    简单的activiti请假流程

    Activiti会根据部署的流程定义自动创建相应的任务。 5. 执行与流转: 在流程启动后,任务会按照定义的顺序进行流转。在这个请假流程中,可能涉及到多个步骤,如员工提交申请、主管审批、人事部门复核等。每个任务...

    Activiti流程设计器代码

    Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于Java的超快速、超...

    activiti流程管理的几个小例子

    这个压缩包中的“activiti流程管理的几个小例子”旨在帮助用户更深入地理解和应用Activiti。通过这些实例,我们可以探索以下几个关键知识点: 1. **流程定义(Process Definition)**:在Activiti中,流程定义是...

    activiti工作流流程跟踪图(图片(两种方式))

    本实例聚焦于如何生成和查看Activiti流程的跟踪监控图,并且通过两种不同的方式来实现图片的生成,分别是路径线和节点的高亮显示。 首先,我们要理解Activiti的工作流模型。流程定义(Process Definition)是用BPMN...

    activiti代码实现审批流程的审批

    在Activiti中,这些流程可以通过流程定义文件(通常为`.bpmn`格式)来描述,该文件定义了各个步骤、参与者和决策规则。 在Java应用中集成Activiti,我们首先需要添加Spring-activiti的相关依赖。Spring框架与...

    activiti实现请假流程

    1. **流程定义**:使用 BPMN 2.0 标准的图形化建模工具,可以清晰地定义请假流程的各个步骤,如申请、审批、驳回等,以及它们之间的流转规则。 2. **任务管理**:Activiti 提供了任务服务,使得每个请假申请都能...

    oa项目中的activiti流程demo

    这个"oa项目中的activiti流程demo"是一个实例,展示了如何将Activiti集成到Java项目中,以实现灵活、可配置的工作流。下面将详细阐述其关键知识点。 1. **Activiti简介** Activiti是一款开源的业务流程管理(BPM)...

    Activiti可视化流程设计器

    压缩包中的"jeesite"可能是Jeesite框架的一个示例项目,Jeesite是一个开源的Java快速开发平台,集成了Activiti流程引擎,可以方便地将Activiti Designer设计的流程模型整合到实际的应用中。 总之,Activiti ...

    使用activiti工作流引擎显示流程图时高亮显示流程图中已执行节点和已执行路径方法源代码

    总的来说,实现Activiti工作流引擎的流程图高亮显示功能需要结合Activiti的API、流程定义解析以及图形渲染技术。开发者需要理解Activiti的工作原理,熟悉历史数据的查询,以及具备一定的图形处理能力。通过这样的...

    Activiti学习文档(二)之画流程图并部署流程

    Activiti是一款开源的工作流引擎,它基于模型驱动的架构,能够帮助企业实现业务流程自动化。在“Activiti学习文档(二)之画流程图并部署流程”中,我们将深入探讨如何设计和部署工作流程。 首先,流程图是Activiti...

    easyui实现的Activiti工作流引擎web版流程设计器

    在实现这样一个Web版流程设计器时,开发者通常会利用EasyUI的组件(如对话框、表单、树形结构等)来构建用户界面,同时需要结合Activiti的API,如读取、编辑和保存流程定义。此外,可能还需要自定义一些插件或者扩展...

Global site tag (gtag.js) - Google Analytics