创建了流程图资源后,
一般我们需要对创建的资源如(leave.bpmn、leave.png)进行部署,部署方式我这里列出四种方式,前三种为单个流程资源的部署,第四种方式可以同时部署多个流程资源。
一、部署流程资源四种方式
部署流程资源有很多种方法,包括classpath、InputStream、字符串、zip格式压缩包
1.classpath方式
读取processes路径下制定名称的流程图,注意一次只能加载一个资源文件
2.InputStream方式
使用InputStream方式部署流程资源需要传入一个输入流及资源的名称,输入流的来源不限,可以从classpath读取,也可以从一个绝对路径文件读取,也可以是从网络上读取。
3.字符串方式
利用字符串方式可以直接传入纯文本作为资源的来源,和前两种方式类似,字符串方式的实现原理是把一组字符串的内容转化为字节流后再部署。
4.zip/bar格式压缩包方式
以上3种部署方式一次只能部署一个资源,除非执行多次deployment.addXxx()方法,如何一次部署多个资源呢?很简单,是我们可以使用zip/bar格式压缩包方式。将资源文件手动或使用Ant脚本,打包文件扩展名可以是Activiti官方推荐的bar或普通的zip。
二、部署流程资源四种方式分别对应的源码实现
下面提供四种方式的源码
package com.springboot.activiti.eimm.leave.controller;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.zip.ZipInputStream;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.springboot.activiti.eimm.leave.dao.LeaveMapper;
import com.springboot.activiti.eimm.leave.service.LeaveService;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
@RequestMapping("/leave")
public class LeaveController {
@Autowired
LeaveMapper leaveMapper;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private IdentityService identityService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private ProcessEngine processEngine;
@Autowired
private HistoryService historyService;
@Autowired
private LeaveService leaveService;
//部署流程资源【第一种方式:classpath】
@RequestMapping("/deploy1")
public void deploy1( ){
Deployment deployment = processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
.createDeployment()//创建部署对象
.name("请假申请审核流程")//声明流程的名称
.addClasspathResource("processes/leave.bpmn")//加载资源文件,一次只能加载一个文件
.addClasspathResource("processes/leave.png")//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//1
System.out.println("部署时间:"+deployment.getDeploymentTime());
}
//部署流程资源【第二种方式:InputStream】
@RequestMapping("/deploy2")
public void deploy2( ) throws FileNotFoundException{
//获取资源相对路径
String bpmnPath = "processes/leave.bpmn";
String pngPath = "processes/leave.png";
//读取资源作为一个输入流
FileInputStream bpmnfileInputStream = new FileInputStream(bpmnPath);
FileInputStream pngfileInputStream = new FileInputStream(pngPath);
Deployment deployment = processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
.createDeployment()//创建部署对象
.addInputStream("leave.bpmn",bpmnfileInputStream)
.addInputStream("leave.png", pngfileInputStream)
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//1
System.out.println("部署时间:"+deployment.getDeploymentTime());
}
//部署流程资源【第三种方式:InputStream】
@RequestMapping("/deploy3")
public void deploy3( ) throws FileNotFoundException{
//字符串
String text = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions>...</definitions>";
Deployment deployment = processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
.createDeployment()//创建部署对象
.addString("leave.bpmn",text)
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//1
System.out.println("部署时间:"+deployment.getDeploymentTime());
}
//部署流程资源【第四种方式:zip/bar格式压缩包方式】
@RequestMapping("/deploy4")
public void deploy4( ) throws FileNotFoundException{
//从classpath路径下读取资源文件
InputStream in = this.getClass().getClassLoader().getResourceAsStream("processes/leave.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
.createDeployment()//创建部署对象
.addZipInputStream(zipInputStream)//使用zip方式部署,将leave.bpmn和leave.png压缩成zip格式的文件
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//1
System.out.println("部署时间:"+deployment.getDeploymentTime());
}
}
启动程序,访问127.0.0.1:8080/项目名称/leave/deploy1 ,控制台打印信息,查看数据库文件是否发生改变
三、部署流程资源源码执行完毕后数据库数据改变
启动程序一般是会生成28张activiti表,其中ACT_GE_PROPERTY属性数据表会自动生成一条记录,会自动生成下一次流程资源文件部署所需主键id
执行上述流程部署源码,数据库中会有四张表有数据变化
更多信息参考
https://lucaslz.gitbooks.io/activiti-5-22/content/actge_property_ff08_shu_xing_shu_ju_biao_ff09.html
1、ACT_RE_DEPLOYMENT(部署信息表)
部署流程定义时需要被持久化保存下来的信息。
2、ACT_RE_PROCDEF(流程定义数据表)
业务流程定义数据表。此表和ACT_RE_DEPLOYMENT是多对一的关系,即,一个部署的bar包里可能包含多个流程定义文件,每个流程定义文件都会有一条记录在ACT_RE_PROCDEF表内,每个流程定义的数据,都会对应ACT_GE_BYTEARRAY表内的一个资源文件和PNG图片文件。和ACT_GE_BYTEARRAY的关联是通过程序用ACT_GE_BYTEARRAY.NAME与ACT_RE_PROCDEF.NAME完成的,在数据库表结构中没有体现。
3、ACT_GE_BYTEARRAY(二进制数据表)资源文件表
保存流程定义图片和xml、Serializable(序列化)的变量,即保存所有二进制数据,特别注意类路径部署时候,不要把svn等隐藏文件或者其他与流程无关的文件也一起部署到该表中,会造成一些错误(可能导致流程定义无法删除)
4、ACT_GE_PROPERTY(主键生成表)
将生成下次流程部署的主键ID。
上面执行部署流程文件代码后,第二行数据从value:1 ; REV_:1 变为以下数据
如果你觉得本篇文章对你有所帮助的话,麻烦请点击头像右边的关注按钮,谢谢!
技术在交流中进步,知识在分享中传播