2 流程资源部署

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");
        
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章