Activiti流程自动部署

思路:

1.修改流程资源文件后,部署至服务器;

2.服务器启动时自动部署文件至数据库;

3.部署时,校验文件,如果修改,则部署。

package com.pccw.solutions.diagram.execute;

import java.io.File;
import java.io.FileInputStream;
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.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.stereotype.Component;

/**
 * @Description:
 * 1.结合Spring自动部署Activit流程定义文件
 * 2.该类需要注册为Spring的组件,启动服务时会自动执行
 * 3.部署前判断流程图是否修改,修改则部署
 *
 */
@Component
public class WorkflowDeployer {

	private static final Logger logger = Logger.getLogger(WorkflowDeployer.class);
	private Resource[] deploymentResources;
	
	/**
	 * 利用构造方法初始化变量
	 * @throws Exception 
	 */
	private WorkflowDeployer() throws Exception{
		ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
		deploymentResources = resolver.getResources("classpath:/com/pccw/solutions/diagram/*.bpmn");
		deploying();
	}

	/**
	 * 部署流程资源文件数据
	 * @throws Exception
	 */
	public void deploying() throws Exception {
		logger.info(">>>deploying() - 流程资源部署开始");
		if (deploymentResources != null) {
			/*创建流程引擎配置对象*/
			ProcessEngineConfiguration config = ProcessEngineConfiguration
					.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
			/*根据配置对象创建工作流引擎*/
			ProcessEngine engine = config.buildProcessEngine();
			/*得到仓库服务对象*/
			RepositoryService repositoryService = engine.getRepositoryService();
			for (Resource r : deploymentResources) {
				String deploymentName = 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(), deploymentName);
						if (in != null) {
							File f = File.createTempFile("deployment", "bpmn",
									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("不能读取资源 " + deploymentName + ", 输入流为空");
						}
					} 
					catch (ActivitiException ex) {
						logger.error("Unable to read " + deploymentName
								+ " of deployment " + existing.getName()
								+ ", id: " + existing.getId()
								+ ", will re-deploy");
					}
				}
				if (doDeploy) {
					DeploymentBuilder deployment = repositoryService.createDeployment();
					FileInputStream pngStream = new FileInputStream(r.getFile().toString().replace(".bpmn", ".png"));
					deployment.name(deploymentName).addInputStream(deploymentName, r.getInputStream());
					deployment.name(deploymentName).addInputStream(deploymentName.replace(".bpmn", ".png"), pngStream);
					deployment.deploy();
				}
			}
		}
		logger.info("<<<deploying() - 流程资源部署结束");
	}

}

 

转载于:https://my.oschina.net/843294669/blog/743786

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值