1 流程文档部署生命周期
1.1 定义流程文档
客户端根据自己业务来定义流程文档。
1.2 启动流程引擎
流程引擎启动后自动构建ProcessEngine实例对象,然后就可以通过该实例对象获取服务类实例对象,比如TaskService。
1.3 部署流程文档
调用流程文档部署方法,会执行如下操作:
(1)将流程文档中的元素解析为Activiti的内部表示BaseElement实例。
(2)对BaseElement实例对象再次解析,进而将其转成流程虚拟机中的ActivitiImpl实例对象或者TransitionImpl实例对象,该过程也是将BaseElement实例注入流程虚拟机的过程。
1.4 添加缓存
缓存流程定义实例。流程引擎默认开启缓存。
2 DeploymentBuilder核心类
public interface DeploymentBuilder {
//根据文件流部署
DeploymentBuilder addInputStream(String var1, InputStream var2);
//根据文件位置部署
DeploymentBuilder addClasspathResource(String var1);
//根据字符串部署
DeploymentBuilder addString(String var1, String var2);
//根据字节数组部署
DeploymentBuilder addBytes(String var1, byte[] var2);
//根据压缩包部署
DeploymentBuilder addZipInputStream(ZipInputStream var1);
//根据对象部署
DeploymentBuilder addBpmnModel(String var1, BpmnModel var2);
//如果调用,则不会针对BPMN 2.0 XSD进行XML模式验证。
DeploymentBuilder disableSchemaValidation();
//如果被调用,将不会针对流程定义执行对流程定义在引擎上可执行的验证(也就是说后续流程定义是否成功与否不保证)。
DeploymentBuilder disableBpmnValidation();
//部署名称
DeploymentBuilder name(String var1);
//类别
DeploymentBuilder category(String var1);
//部署设置键属性
DeploymentBuilder key(String var1);
//分布式预留字段
DeploymentBuilder tenantId(String var1);
//禁止重复部署
DeploymentBuilder enableDuplicateFiltering();
DeploymentBuilder activateProcessDefinitionsOn(Date var1);
DeploymentBuilder deploymentProperty(String var1, Object var2);
//正式部署
Deployment deploy();
}
以上部署方式中最常用的几种:
addInputStream()
一般用于部署单个bpmn文件。
addZipInputStream()
一般用于多文件部署,将其打成压缩包。
addBpmnModel()
一般用于动态工作流引擎的自定义,这个在流程引擎的扩展上非常实用。
2.1 文件流部署
@Resource
private RepositoryService repositoryService;
/**
* 文件上传 输入流部署
* @param deploymentName
* @param file
* @throws Exception
*/
@PostMapping("/addProcess/{deploymentName}")
public ResponseEntity<Response> addProcess(@PathVariable String deploymentName, @RequestParam("file") MultipartFile file) throws Exception {
//enableDuplicateFiltering 防止重复部署 校验资源名称和资源内容
repositoryService.createDeployment().enableDuplicateFiltering().addInputStream(file.getOriginalFilename(), file.getInputStream())
.name(deploymentName).deploy();
return ResponseEntity.ok(buildSuccessResponse());
}
2.2 压缩包部署
/**
* 压缩包部署 会自动将其解压并部署
* @param file
* @return
* @throws Exception
*/
@PostMapping("/addProcessByZip")
public ResponseEntity<Response> addProcessByZip(@RequestParam("file") MultipartFile file) throws Exception {
//解决压缩包中文件名称是中文的报错问题,所以要设置GBK
ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream(),Charset.forName("GBK"));
repositoryService.createDeployment().enableDuplicateFiltering().addZipInputStream(zipInputStream).enableDuplicateFiltering().deploy();
return ResponseEntity.ok(buildSuccessResponse());
}
注意:
压缩包中文件名称是中文的报错问题,要设置编码方式为GBK。
2.3 BpmnModel方式部署
Model的创建可以用下图描述
2.4 校验BpmnModel实例对象
在我们组装完BpmnModel后需要对该格式进行校验,确保转化的XML是正确的。Activiti提供了校验的jar包
校验代码如下:
public boolean processValidator(BpmnModel bpmnModel){
ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory();
ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator();
List<ValidationError> validate = defaultProcessValidator.validate(bpmnModel);
//如果错误集合中有数据,则证明校验未通过
return validate.size() <= 0;
}
2.5 BpmnModel转换流程文档
public void convertToXML(BpmnModel bpmnModel) {
BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
String s = new String(bpmnXMLConverter.convertToXML(bpmnModel, "UTF-8"));
}
2.6 流程文档转BpmnModel
public void convertToBpmnModel() {
String resource = "/common.bpmn";
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(resource);
InputStreamSource inputStreamSource = new InputStreamSource(inputStream);
BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
BpmnModel bpmnModel = bpmnXMLConverter.convertToBpmnModel(inputStreamSource, true, false, "UTF-8");
}