流程部署-上传到服务数据库,正在执行任务
1、部署单个BPMN文件到服务
部署BPMN文件到流程引擎中,一般是Web界面上传 bpmn.xml 文件部署,这里只是模拟读取项目文件夹下的文件进行部署。
@Test
public void deploymentTest(){
//1 创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2 获取持久化服务 RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//3 部署单个BPMN到Activiti 流程中(上传BPMN文件到数据库)
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/MyLeave.bpmn")
//png 资源命名有规范。MyLeave.myLeave.png|jpg|gif|svg(bpmn名词.流程ID.图片扩展名)
.addClasspathResource("bpmn/MyLeave.myLeave.png")
.name("请假流程")
.deploy();
log.info("部署的流程ID:"+deployment.getId());
log.info("部署的流程Name:"+deployment.getName());
}
2、1次部署多个BPMN文件
有时发布时多个流程文件需要部署时,可以打包文件为ZIP文件,上传这个ZIP文件即可。
/**
* 使用ZIP文件,1次部署多个流程PBMN文件
*/
@Test
public void deployProcessByZip(){
InputStream inputStream=this.getClass()
.getClassLoader()
.getResourceAsStream("bpmn/myLeave.zip");
ZipInputStream zipInputStream=new ZipInputStream(inputStream);
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment()
.addZipInputStream(zipInputStream).deploy();
log.info("流程部署ID:{}",deploy.getId());
log.info("流程部署Name:{}",deploy.getName());
}
3、流程定义信息查询
/**
* 流程定义查询,流程部署到服务后(数据库)。如何从服务中查询具体的流程定义?
*/
@Test
public void queryProcessDefinition(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
List<ProcessDefinition> pdes = processDefinitionQuery.processDefinitionKey("myLeave")
.orderByProcessDefinitionVersion()
.desc()
.list();
for(ProcessDefinition pd:pdes){
log.info("流程定义ID:{}",pd.getId());
log.info("流程定义name:{}",pd.getName());
log.info("流程定义key:{}",pd.getKey());
log.info("流程定义version:{}",pd.getVersion());
log.info("流程部署ID:{}",pd.getDeploymentId());
}
}
4、查询流程下正在跑的任务
/**
* 查询指定流程下是否有实例正在跑,还没有执行完成,流程执行到了哪一步?
* 请假流程有实例正在跑,这里就会查询到
*/
@Test
public void queryProcessInstance(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
List<ProcessInstance> pis = runtimeService.createProcessInstanceQuery()
.processDefinitionKey("myLeave")
.list();
for(ProcessInstance pi:pis){
log.info("流程实例ID:{}",pi.getProcessInstanceId());
log.info("所属流程定义ID:{}",pi.getProcessDefinitionId());
log.info("是否执行完成:{}",pi.isEnded());
log.info("是否暂停:{}",pi.isSuspended());
log.info("当前活动标识:{}",pi.getActivityId());
//一般用BusinessKey 和业务某个ID进行关联,从而流程和业务关联在一起
log.info("当前业务关键字:{}",pi.getBusinessKey());
}
}
5、删除流程部署信息
废弃的流程信息需要从服务器中删除部署信息。
/**
* 删除流程部署,部署后的流程可删除
*/
@Test
public void deleteDeployment(){
//流程部署Id
String deploymentId="17501";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
//根据流程部署ID,从数据库中删除流程部署。用于废弃的流程删除部署,后续不会再开启流程
repositoryService.deleteDeployment(deploymentId);
//如果当前流程部署下有流程实例还没有跑完,是不允许删除的,会报错。这里可强制删除,内部会级联删除,把相关信息都会删除。
// repositoryService.deleteDeployment(deploymentId,true);
}
6、流程资源下载
有时业务系统需要展示流程图或流程文件信息时,需要下载页面展示
/**
* 下载流程资源文件信息
* 一般是在业务修改中下载流程定义文件,用于业务系统展示流程图 等业务
*/
@Test
public void loadBpmnFile() throws IOException {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
//查询到流程定义信息
ProcessDefinition pDef = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("myLeave")
.singleResult();
String deploymentId = pDef.getDeploymentId();
//下载流程图和流程定义文件
InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, pDef.getDiagramResourceName());
InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, pDef.getResourceName());
//保存到本地
FileOutputStream pngOut=new FileOutputStream(new File("/Volumes/work/test/myLeave.png"));
FileOutputStream bpmnOut=new FileOutputStream(new File("/Volumes/work/test/myLeave.bpmn"));
IOUtils.copy(pngInput,pngOut);
IOUtils.copy(bpmnInput,bpmnOut);
pngInput.close();
bpmnInput.close();
pngOut.close();
bpmnOut.close();
}