上篇文章主要写了Activiti工作流总体概述。
本篇文章的仓库地址:https://github.com/qiuxinfa/activiti-study。
接下来主要聊聊RepositoryService在工作流中的主要作用与操作。同时也讲到RepositoryService主要作用:
1.部署流程,查询流程定义和部署信息
2.挂起、激活流程定义
3.创建模型,获取部署的资源和流程图像
一、部署流程,查询流程定义和部署信息
流程部署有两种方式:
- 如果你的流程文件放在了resources/processes目录下,则在springBoot启动的过程中就会自动部署该目录下的流程文件。文件的格式可以是bpmn、bpmn20.xml。
- 通过接口进行手动部署
我们主要看一下通过接口部署流程:
@PostMapping
public String deployProcess(MultipartFile file){
if (file == null){
return "流程部署文件不能为空";
}
String deploymentId = null;
try {
Deployment deploy = repositoryService.createDeployment()
.addInputStream(file.getOriginalFilename(), file.getInputStream()).deploy();
deploymentId = deploy.getId();
} catch (IOException e) {
System.out.println("流程部署失败");
e.printStackTrace();
}
return deploymentId;
}
重点是下面这句代码,完成了流程的部署,成功之后返回流程部署id。这里有很多重载的方法,感兴趣的可以自行查看
Deployment deploy = repositoryService.createDeployment()
.addInputStream(file.getOriginalFilename(), file.getInputStream()).deploy();
获取流程部署信息列表
List<Deployment> deployments = repositoryService.createDeploymentQuery().list();
如果知道了流程定义id,则可以精确获取流程部署信息
Deployment deployment = repositoryService.createDeploymentQuery()
.deploymentId(definition.getDeploymentId()).singleResult();
值得注意的是,一次部署可以包含多个流程定义文件
获取流程定义列表
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
二、挂起、激活流程定义
流程定义的挂起
repositoryService.suspendProcessDefinitionById(processDefinitionId);
流程定义的激活
repositoryService.activateProcessDefinitionById(processDefinitionId);
流程定义被挂起之后,便不能启动流程,必须先激活流程定义
三、创建模型,获取部署的资源和流程图像
1. 创建模型
这是在流程设计的时候使用的,先创建模型,再画流程图,下面就是一个创建模型的接口
/**
* 创建模型
*/
@PostMapping("/models")
public String createModel(@RequestParam String key, @RequestParam String name, @RequestParam String category){
Model model = repositoryService.newModel();
model.setKey(key);
model.setName(name);
model.setCategory(category);
repositoryService.saveModel(model);
return "创建模型成功,模型id = "+model.getId();
}
主要是利用repositoryService对象的newModel()和saveModel()方法
有创建模型,自然就有删除模型
repositoryService.deleteModel(modelId);
2.将流程图的xml文件的等信息保存到数据库中
/**
* 保存模型
*/
@PostMapping(value = "/saveModelXml")
public String saveModelXml(@RequestBody ModelDTO dto) {
Model model = repositoryService.getModel(dto.getModelId());
model.setVersion(model.getVersion()+1);
repositoryService.saveModel(model);
repositoryService.addModelEditorSource(dto.getModelId(),dto.getBpmnXml().getBytes());
repositoryService.addModelEditorSourceExtra(dto.getModelId(),dto.getSvgXml().getBytes());
return "保存模型成功!";
}
3.获取流程定义的图像信息
@GetMapping("/viewProcessImg")
public void viewProcessImg(String processDefinitionId, HttpServletResponse response){
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
ProcessDiagramGenerator diagramGenerator = processEngine.getProcessEngineConfiguration().getProcessDiagramGenerator();
try {
// 中文显示的是口口口,设置字体就好了
InputStream imageStream = diagramGenerator
.generateDiagram(bpmnModel, "png", new ArrayList<>(), new ArrayList<>(),
"宋体", "微软雅黑", "黑体", null, 2.0);
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("image/png");
OutputStream os = response.getOutputStream();
int bytesRead;
byte[] buffer = new byte[8192];
while ((bytesRead = imageStream.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
outputStream.close();
imageStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}