`

Activiti结合Spring自动部署流程资源

阅读更多
Activiti 整合spring的时候,提供了一个自动部署的特性:
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
  ...
  <property name="deploymentResources" value="classpath*:/org/activiti/spring/test/autodeployment/autodeploy.*.bpmn20.xml" />

</bean>

这样当每次启动web容器的时候就会把指定路径的流程资源文件部署到Activiti DB上。不过这样会产生一个问题,资源文件在没经过任何改动的情况下,特别是我们在做Testing的时候,还是会重新部署一个新的版本到DB上,这样会造成不别要的重复部署。我们在部署之前,应该先判断资源文件是否有改动过,如果有,才部署新版本到DB上。

实现这个功能很简单,只需要建立一个实现了 InitializingBean 接口的 spring bean,在afterPropertiesSet()方法里面进行判断和部署就可以了。

具体代码如下:
/**
 * 
 */
package com.highcolu.dms.workflow;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.activiti.engine.ActivitiException;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.FatalBeanException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.io.Resource;

/**
 * @Description:结合Spring自动部署Activit流程定义文件
 * @version:2012-12-20
 * @author: <a href="mailto:zhouwentao16@gmail.com">周文滔</a>
 */
public class WorkflowDeployer implements InitializingBean,
		ApplicationContextAware {

	private static final Log LOGGER = LogFactory.getLog(WorkflowDeployer.class);
	private Resource[] deploymentResources;
	private String category;
	ApplicationContext appCtx;

	public void setDeploymentResources(Resource[] resources) {
		this.deploymentResources = resources;
	}

	public void setCategory(String category) {
		this.category = category;
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.appCtx = applicationContext;
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		if (category == null) {
			throw new FatalBeanException("缺失属性 : category");
		}
		if (deploymentResources != null) {
			RepositoryService repositoryService = appCtx
					.getBean(RepositoryService.class);
			for (Resource r : deploymentResources) {
				String deploymentName = category + "_" + r.getFilename();
				String resourceName = r.getFilename();
				boolean doDeploy = true;
				List<Deployment> deployments = repositoryService
						.createDeploymentQuery().deploymentName(deploymentName)
						.orderByDeploymenTime().desc().list();
				if (!deployments.isEmpty()) {
					Deployment existing = deployments.get(0);
					try {
						InputStream in = repositoryService.getResourceAsStream(
								existing.getId(), resourceName);
						if (in != null) {
							File f = File.createTempFile(
									"deployment",
									"xml",
									new File(System
											.getProperty("java.io.tmpdir")));
							f.deleteOnExit();
							OutputStream out = new FileOutputStream(f);
							IOUtils.copy(in, out);
							in.close();
							out.close();
							doDeploy = (FileUtils.checksumCRC32(f) != FileUtils
									.checksumCRC32(r.getFile()));
						} else
							throw new ActivitiException("不能读取资源 "
									+ resourceName + ", 输入流为空");
					} catch (ActivitiException ex) {
						LOGGER.error("Unable to read " + resourceName
								+ " of deployment " + existing.getName()
								+ ", id: " + existing.getId()
								+ ", will re-deploy");
					}
				}
				if (doDeploy) {
					repositoryService.createDeployment().name(deploymentName)
							.addInputStream(resourceName, r.getInputStream())
							.deploy();
					LOGGER.warn("文件部署成功 : " + r.getFilename());
				}
			}
		}
	}

}

然后在spring的配置文件里面配置好这个bean就可以了.
	<bean id="workflowDeployer"
		class="com.jeemis.workflow.deployer.WorkflowDeployer">
		<property name="category" value="TEST" />
		<property name="deploymentResources" value="classpath*:process/TEST.bpmn20.xml" />
	</bean>


原文来自:http://jeemiss.iteye.com/blog/1103431
分享到:
评论

相关推荐

    activiti-explorer 与spring整合

    这通常涉及到将 `activiti-explorer.war` 文件部署到应用服务器(如 Tomcat),或者将其解压并将其资源添加到 Spring 应用的 Web-INF 目录下。同时,需要配置 `activiti.cfg.xml` 文件,以指向我们之前配置的 Spring...

    activiti + spring

    当我们将 `Activiti` 与 `Spring` 结合使用时,可以构建出高效、灵活且易于维护的业务流程管理系统。 `JUnit` 是一个广泛使用的Java单元测试框架,它使得开发者能够编写和运行可重复的自动化测试用例,以确保代码的...

    Spring结合Activiti工作流

    5. **部署流程定义**:在应用程序启动或需要时,使用流程引擎的部署API将流程模型部署到Activiti引擎,这将创建流程定义实例。 6. **操作流程实例**:通过Spring注入的流程API,如`RuntimeService`、`TaskService`...

    activiti + spring mvc 基础web项目.zip

    Activiti是一款流行的开源工作流管理系统,用于实现业务流程自动化。而Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序,提供模型-视图-控制器(MVC)架构。 【描述】"activiti + spring mvc 基础web...

    activiti 5.16 流程管理 中文版

    - **资源的自动部署**:自动部署流程定义文件。 - **单元测试**:Spring环境下的单元测试技巧。 - **基于注解的配置**:使用Spring注解进行配置。 - **JPA和Hibernate 4.2.x**:与持久化框架的集成方式。 #### 6. ...

    springboot+activiti集成Demo

    SpringBoot与Activiti集成是一个常见的企业级应用开发实践,它将高效的SpringBoot框架与流程引擎Activiti相结合,用于实现业务流程自动化。这个集成Demo提供了一个快速启动的模板,帮助开发者理解如何在SpringBoot...

    activiti-modeler集成到spring项目

    在IT行业中,流程管理工具是企业自动化不可或缺的一部分,而Activiti作为一款强大的工作流引擎,被广泛应用在Spring框架中的各种项目。本篇文章将深入探讨如何将`activiti-modeler`集成到Spring项目中,以及利用`...

    spring-activiti.zip

    在实际开发中,你可能还需要学习如何创建和部署流程定义(BPMN XML文件),如何定义用户任务(User Task)并关联外置表单,以及如何使用Activiti提供的API进行流程的启动、查询、干预等操作。 总的来说,"spring-...

    activiti系列jar包(含 5.12 、5.14、 5.15)

    在实际应用中,Activiti 可以与 Spring 框架、Hibernate ORM 等技术结合,构建出强大的企业级工作流应用。它提供了丰富的 API 和服务,允许开发者在程序中控制流程的执行,如启动流程实例、完成任务、查询历史记录等...

    IDEA创建spring boot +Activiti 6.0

    6. **编写流程相关代码**:包括部署流程定义,启动流程实例,处理任务节点等。可以使用Activiti提供的API,如`runtimeService.startProcessInstanceByKey()`启动流程,`taskService.complete(taskId)`完成任务。 7....

    Activiti6.0工作流引擎springboot项目代码

    在本项目中,我们重点探讨的是Activiti 6.0版本,它集成了Spring Boot框架,使得开发和部署流程应用程序变得更加便捷。 1. **Activiti 6.0工作流引擎**: Activiti 6.0是Activiti的一个重要里程碑,它提供了许多新...

    spring-boot-activiti-moduler-test.zip

    本文将深入探讨如何将Spring Boot与Activiti模块结合,构建一个高效的工作流程管理系统。 首先,我们需要理解Spring Boot的核心理念:简化Spring应用的初始搭建以及开发过程。它通过自动配置和起步依赖,使得开发者...

    spring boot整合activiti

    将 BPMN 文件存放在项目资源目录下的 `processes` 目录,Spring Boot 启动时会自动部署到 Activiti 引擎。 **5. 创建业务接口和实现** 定义与工作流相关的业务接口,比如启动流程、完成任务等,并实现这些接口。...

    activiti 项目的dome

    Activiti 是一个开源的工作流和业务自动化引擎,它支持业务流程建模、部署、执行和监控。这个"activiti 项目的dome"是基于Spring Boot的Activiti实践项目,可以帮助开发者快速理解和应用Activiti在实际开发中的用法...

    springboot+activiti流程设计

    5. **部署流程**:在 SpringBoot 应用中,通过调用流程引擎的部署 API 来加载并部署 BPMN XML 文件,使其生效。 6. **业务逻辑集成**:通过注解驱动或编程方式与 Activiti 交互,启动流程实例,完成任务分配、任务...

    SpringBoot集成Activiti案例

    本案例将探讨如何将Activiti与SpringBoot相结合,以实现高效、灵活的流程管理功能。 **一、流程部署与查询流程定义** 在SpringBoot项目中集成Activiti,首先需要添加相应的依赖到`pom.xml`文件中。接着,我们需要...

    activiti工作流

    它可能还会介绍如何部署流程定义到Activiti Engine,并通过API或服务接口启动、查询和控制流程实例。实战部分可能涉及实际业务场景,比如请假申请、报销审批等,以帮助读者更好地理解Activiti在实际工作中的应用。 ...

    activiti整合sprin

    标题“activiti整合spring”涉及到的是在企业级应用开发中,如何将Activiti工作流引擎与Spring框架相结合,以实现灵活、可扩展的业务流程自动化。Activiti是一款开源的工作流和业务流程管理(BPM)系统,而Spring是...

    工作流SpringBoot2-Activiti-6.zip

    例如,我们可能会创建一个`ProcessEngine`实例,部署流程定义,然后使用`RuntimeService`启动新的流程实例。 此外,项目可能还包含了数据库配置,因为Activiti需要一个数据库来存储流程实例、任务和其他相关数据。...

    activiti学习思维导图

    Activiti 是一个开源的工作流和业务自动化引擎,广泛应用于企业级应用中,提供流程定义、执行、监控等功能。本资源包含的"activiti学习思维导图"是一份关于Activiti学习的综合指南,旨在帮助用户从基础到进阶地掌握...

Global site tag (gtag.js) - Google Analytics