activity流程部署的几种方式

本文详细介绍了Activiti工作流中的流程资源类型,如bpmn20.xml、流程图片、表单和规则文件。并展示了多种部署资源的方法,包括classpath、InputStream、字符串和zip压缩包方式,同时解释了每种方法的实现原理。在部署过程中,涉及到ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF和ACT_GE_BYTEARRAY等数据库表的变化,以及ACT_GE_PROPERTY表在生成主键ID方面的作用。

流程资源可以是各种类型的文件,在启动流程或流程实例运行过程中会被读取。下面介绍常用的流程资源。

一、流程资源

         流程定义文件:扩展名为bpmn20.xml和bpmn;
         流程定义的图片:用BPMN2.0规范的各种图形描绘,一般用PNG的格式;
         表单文件:把表单内容保存在一个文件中,其扩展名为drl;
         规则文件:其扩展名为drl;

 二、部署流程资源

           部署流程资源有很多种方法,包括classpath、InputStream、字符串、zip格式压缩包,下面将一一介绍。

 1.classpath方式

	public class ProcessDefinitionTest {
		/** 流程引擎(核心对象),默认加载类路径下命名为activiti.cfg.xml */
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		// 部署流程定义
		public void deployementProcessDefinition() {
			Deployment deployment = processEngine.getRepositoryService()// 获取流程定义和部署对象相关的Service
					.createDeployment()// 创建部署对象
					.name("helloworld演示")// 声明流程的名称
					.addClasspathResource("diagrams/helloworld.bpmn")// 加载资源文件,一次只能加载一个文件
					.addClasspathResource("diagrams/helloworld.png")//
					.deploy();// 完成部署
			System.out.println("部署ID:" + deployment.getId());// 1
			System.out.println("部署时间:" + deployment.getDeploymentTime());
		}
	}

 2.InputStream方式

        使用InputStream方式部署流程资源需要传入一个输入流及资源的名称,输入流的来源不限,可以从classpath读取,也可以从一个绝对路径文件读取,也可以是从网络上读取。

	//Inputstream方式
	public void deployementProcessDefinitionByInputStream() throws FileNotFoundException {
		// 获取资源相对路径
		String bpmnPath = "diagrams/helloworld.bpmn";
		String pngPath = "diagrams/helloworld.png";

		// 读取资源作为一个输入流
		FileInputStream bpmnfileInputStream = new FileInputStream(bpmnPath);
		FileInputStream pngfileInputStream = new FileInputStream(pngPath);

		Deployment deployment = processEngine.getRepositoryService()// 获取流程定义和部署对象相关的Service
				.createDeployment()// 创建部署对象
				.addInputStream("helloworld.bpmn", bpmnfileInputStream)
				.addInputStream("helloworld.png", pngfileInputStream).deploy();// 完成部署
		System.out.println("部署ID:" + deployment.getId());// 1
		System.out.println("部署时间:" + deployment.getDeploymentTime());
	}

 3.字符串方式

        利用字符串方式可以直接传入纯文本作为资源的来源,和前两种方式类似,字符串方式的实现原理是把一组字符串的内容转化为字节流后再部署。

	// 字符串方式
	public void deployementProcessDefinitionByString() throws FileNotFoundException {
		// 字符串
		String text = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions>...</definitions>";

		Deployment deployment = processEngine.getRepositoryService()// 获取流程定义和部署对象相关的Service
				.createDeployment()// 创建部署对象
				.addString("helloworld.bpmn", text).deploy();// 完成部署
		System.out.println("部署ID:" + deployment.getId());// 1
		System.out.println("部署时间:" + deployment.getDeploymentTime());
	}

4.zip/bar格式压缩包方式

      以上3种部署方式一次只能部署一个资源,除非执行多次deployment.addXxx()方法,如何一次部署多个资源呢?很简单,是我们可以使用zip/bar格式压缩包方式。将资源文件手动或使用Ant脚本,打包文件扩展名可以是Activiti官方推荐的bar或普通的zip。

	// 部署流程定义(zip)
	public void deployementProcessDefinitionByzip() {
		// 从classpath路径下读取资源文件
		InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
		ZipInputStream zipInputStream = new ZipInputStream(in);
		Deployment deployment = processEngine.getRepositoryService()// 获取流程定义和部署对象相关的Service
				.createDeployment()// 创建部署对象
				.addZipInputStream(zipInputStream)// 使用zip方式部署,将helloworld.bpmn和helloworld.png压缩成zip格式的文件
				.deploy();// 完成部署
		System.out.println("部署ID:" + deployment.getId());// 1
		System.out.println("部署时间:" + deployment.getDeploymentTime());
	}

三、数据库表变更

在部署流程定义这一步,数据库中操作三张表:
 (1)ACT_RE_DEPLOYMENT(部署对象表)
 存放流程定义的显示名和部署时间,每部署一次增加一条记录
 
 (2)ACT_RE_PROCDEF(流程定义表)
 存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
 注意:当流程定义的key相同的情况下,使用的是版本升级
 
 (3)ACT_GE_BYTEARRAY(资源文件表)
存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。

 4)ACT_GE_PROPERTY(主键生成表)
 主张表将生成下次流程部署的主键ID。    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值