您现在的位置是:首页 >技术教程 >Activiti学习04网站首页技术教程
Activiti学习04
简介Activiti学习04
这里写目录标题
一、流程定义
流程定义是线下按照bpmn2.0标准去描述业务流程,通常使用 activiti-explorer(web 控制台)或 activiti-eclipse-designer 插件对业务流程进行建模,这两种方式都遵循 bpmn2.0 标准。
将线下定义的流程部署到 activiti 数据库中,这就是流程定义部署,通过调用 activiti 的 api 将流程定义的 bpmn 和 png 两个文件一个一个添加部署到 activiti 中,也可以将两个文件打成 zip 包进行部署。
二、压缩包部署方式
2.1 将 holiday.bpmn 和 holiday.png 压缩成 zip 包。
@Test
public void deployProcessByZip() {
//定义zip输入流
InputStream inputstream = this.getClass()
.getClassLoader()
.getResourceAsStream("diagram/holiday.zip");
ZipInputStream zipInputStream=new ZipInputStream(inputstream);
//获取repositoryService
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 流程部署
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.deploy();
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
}
2.2 查看数据表
# 流程定义部署表,记录流程部署信息
SELECT * FROM activiti.ACT_RE_DEPLOYMENT;
#流程定义表,记录流程定义i信息
select * from activiti.ACT_RE_PROCDEF
#资源表
select * from activiti.ACT_GE_BYTEARRAY
说明:
act_re_deployment 和 act_re_procdef 一对多关系。
一次部署在流程部署表生成一条记录,但一次部署
可以部署多个流程定义,每个流程定义在流程定义表生成一条记录。每一个流程定义在
act_ge_bytearray 会存在两个资源记录,bpmn 和 png。
建议:一次部署一个流程,这样部署表和流程定义表是一对一有关系,方便读取流程部署及流程定
义信息。
三、流程相关操作
3.1 流程定义查询
@Test
public void queryProceccDefinition() {
//流程定义key
String processDefinitionKey = "holiday";
//获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//查询流程定义
ProcessDefinitionQuery processDefinitionQuery = repositoryService
.createProcessDefinitionQuery();
//遍历查询结果
List<ProcessDefinition> list = processDefinitionQuery
.processDefinitionKey(processDefinitionKey)
.orderByProcessDefinitionVersion().desc().list();
for (ProcessDefinition processDefinition : list) {
System.out.println("------------------------");
System.out.println(" 流 程 部 署 id : " +
processDefinition.getDeploymentId());
System.out.println("流程定义id:" + processDefinition.getId());
System.out.println("流程定义名称:" + processDefinition.getName());
System.out.println("流程定义key:" + processDefinition.getKey());
System.out.println("流程定义版本:" + processDefinition.getVersion());
}
}
3.2 流程定义删除
@Test
public void deleteDeployment() {
// 流程部署id
String deploymentId = "1";
// 通过流程引擎获取repositoryService
RepositoryService repositoryService = ProcessEngines.getDefaultProcessEngine()
.getRepositoryService();
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//repositoryService.deleteDeployment(deploymentId, true);
}
说明:
- 使用 repositoryService 删除流程定义
- 如果该流程定义下没有正在运行的流程,则可以用普通删除。
- 如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关
记录全部删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使
用。
3.3 流程定义资源查询
通过流程定义对象获取流程定义资源,获取 bpmn 和 png。
3.3.1 方式一
@Test
public void getProcessResources1() throws IOException {
// 流程定义id
String processDefinitionId = "holiday:1:2504";
// 获取repositoryService
RepositoryService repositoryService = ProcessEngines.getDefaultProcessEngine()
.getRepositoryService();
// 流程定义对象
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
//获取bpmn
String resource_bpmn = processDefinition.getResourceName();
//获取png
String resource_png =
processDefinition.getDiagramResourceName();
// 资源信息
System.out.println("bpmn:" + resource_bpmn);
System.out.println("png:" + resource_png);
File file_png = new File("D:/ceshi/purchasingflow01.png");
File file_bpmn = new File("D:/ceshi/purchasingflow01.bpmn");
// 输出bpmn
InputStream resourceAsStream = null;
resourceAsStream = repositoryService.getResourceAsStream(
processDefinition.getDeploymentId(), resource_bpmn);
FileOutputStream fileOutputStream = new
FileOutputStream(file_bpmn);
byte[] b = new byte[1024];
int len = -1;
while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
fileOutputStream.write(b, 0, len);
}
// 输出图片
resourceAsStream = repositoryService.getResourceAsStream(
processDefinition.getDeploymentId(), resource_png);
fileOutputStream = new FileOutputStream(file_png);
// byte[] b = new byte[1024];
// int len = -1;
while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
fileOutputStream.write(b, 0, len);
}
}
3.3.2 方式二
@Test
public void getProcessResources2() throws IOException {
//流程部署id
String deploymentId = "2501";
// 通过流程引擎获取repositoryService
RepositoryService repositoryService = ProcessEngines.getDefaultProcessEngine()
.getRepositoryService();
//读取资源名称
List<String> resources =
repositoryService.getDeploymentResourceNames(deploymentId);
String resource_image = null;
//获取图片
for(String resource_name :resources){
if(resource_name.indexOf(".png")>=0){
resource_image = resource_name;
}
}
//图片输入流
InputStream inputStream =
repositoryService.getResourceAsStream(deploymentId, resource_image);
File exportFile = new File("d:/ceshi/holiday.png");
FileOutputStream fileOutputStream = new
FileOutputStream(exportFile);
byte[] buffer = new byte[1024];
int len = -1;
//输出图片
while((len = inputStream.read(buffer))!=-1){
fileOutputStream.write(buffer, 0, len);
}
inputStream.close();
fileOutputStream.close();
}
说明:
- deploymentId 为流程部署 ID
- resource_name 为 act_ge_bytearray 表中 NAME_列的值
- 使用 repositoryService 的 getDeploymentResourceNames方法可以获取指定部署下得所有文件的名称
- 使用 repositoryService 的 getResourceAsStream 方法传入部署 ID和资源图片名称可以获取部署下指定名称文件的输入流
- 最后的将输入流中的图片资源进行输出。
3.4 流程历史信息的查看
@Test
public void testHistoric01() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
HistoricActivityInstanceQuery query =
historyService.createHistoricActivityInstanceQuery();
query.processInstanceId("1");
List<HistoricActivityInstance> list = query.list();
for (HistoricActivityInstance ai : list) {
System.out.println(ai.getActivityId());
System.out.println(ai.getActivityName());
System.out.println(ai.getProcessDefinitionId());
System.out.println(ai.getProcessInstanceId());
System.out.println("==============================");
}
}
即使流程定义已经删除了,流程执行的历史信息通过前面的分析,依然保存在 activiti 的 act_hi_*相
关的表中。所以我们还是可以查询流程执行的历史信息,可以通过 HistoryService 来查看相关的历史
记录。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。