本文主要讲述如何使用RepositoryService进行工作流定义相关的操作。如果还没有搭建Activiti基础环境请参考这篇博客:
https://blog.csdn.net/houkai18792669930/article/details/103385764
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ActivitiApplication.class)
public class ProcessDefinitionTest {
private Gson gson = new Gson();
@Autowired
private ProcessEngine processEngine;
/**
* 流程的部署定义
* addInputStream 支持 ZipInputStream 可以将bpmn文件和图片打zip包传入
*
* 操作三张表:
* 1. act_re_deployment(部署对象表) 存放流程定义的显示名和部署时间,每部署一次增加一条记录
* 2.act_re_procdef(流程定义表) 存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
* 注意:当流程定义的key相同的情况下,使用的是版本升级
* 3.act_ge_bytearray(资源文件表) 存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,
* 一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自
* 动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。
*/
@Test
public void deployTest() throws IOException {
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()
.name("demo")
.addInputStream("test.bpmn",new FileInputStream("D:\\my_svn\\Architecture-activiti\\activiti\\src\\test\\resources\\helloworld.xml"))
.addInputStream("test.png",new FileInputStream("D:\\my_svn\\Architecture-activiti\\activiti\\src\\test\\resources\\helloworld.png"))
.deploy();
System.out.printf(deployment.getId() +" "+ deployment.getName());
}
/**
* 查询流程定义 act_re_procdef
* id规则 processDefinitionKey:processDefinitionVersion:generated-id generated-id是一个自动生成的唯一的数字
*/
@Test
public void queryProcessDefinitionTest(){
ProcessDefinition processDefinition = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.deploymentId("10001").singleResult();
System.out.printf(gson.toJson(processDefinition));
//查询最新版本的流程定义
List<ProcessDefinition> processDefinitionList = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.orderByProcessDefinitionVersion()
.desc()
.list();
System.out.printf(gson.toJson(processDefinitionList.get(0)));
}
/**
* 获取流程定义文档的资源
*
* 在 ACT_GE_BYTEARRAY 中获取名称
* ACT_GE_BYTEARRAY 中获取
*/
@Test
public void viewImageTest() throws Exception{
List<String> nameList= processEngine.getRepositoryService().getDeploymentResourceNames("10001");
String imageName = null;
for (String temp: nameList) {
System.out.printf("name:" + temp);
if(temp.indexOf(".png") >= 0){
imageName = temp;
}
}
System.out.printf("imageName:" + imageName);
InputStream is = processEngine.getRepositoryService().getResourceAsStream("10001", imageName);
byte[] buffer = new byte[is.available()];
is.read(buffer);
File targetFile = new File("D:\\image.png");
try(OutputStream outStream = new FileOutputStream(targetFile);){
outStream.write(buffer);
}
}
/**
* 删除流程的定义
* cascade: 是否级联,默认为false
* false: 如果存在正在执行的流程则报异常
* true: 会删除当前规则相关的所有的信息例如:正在执行的信息,历史信息
*/
@Test
public void deleteDeploymentTest(){
processEngine.getRepositoryService().deleteDeployment("7501", false);
//删除key相同的所有不同版本的流程定义
List<ProcessDefinition> processDefinitionList = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.orderByProcessDefinitionName()
.list();
processDefinitionList.forEach(temp->{
processEngine.getRepositoryService().deleteDeployment(temp.getDeploymentId());
});
}
}