SpringBoot Activiti6系列教程(四)-流程部署

說明

上一章節中,介紹瞭如何基於bpmn2.0的xml文件發起流程和獲取待辦,其中流程文件和代碼打包在一塊兒,但實際項目中不多會把流程文件和代碼一塊兒打包部署,這樣的話,每次流程更新或者發佈新流程都須要從新部署應用,所以咱們制定瞭如下部署方案:java

  • 提供流程部署接口,能夠經過上傳流程文件對流程進行部署。
  • 若是流程文件沒有發生變化,不作新的部署,防止由於從新部署致使版本號上升。

資源部署

activit部署資源文件須要經過RepositoryService建立一個deployment,經過該deployment進行資源的部署,不僅僅是bpmn流程文件,activiti能夠部署任何文件。git

上傳資源到activiti
@Service
public class DeploymentService {

    @Autowired
    private RepositoryService repositoryService;

    /**
     * deploy resource
     *
     * @param name resource name
     * @param fin  resource inputstream
     * @return
     */
    public String deploy(String name, InputStream fin) {
        String deploymentId = repositoryService.createDeployment()
                .addInputStream(name, fin)
                .name(name)
                .key(name)
                .deploy()
                .getId();
        return deploymentId;
    }
}

部署的時候指定部署的namekey,方便後續對部署進行進一步操做。github

聲明restController
@RestController
public class DeploymentController {

    @Autowired
    private DeploymentService service;

    @PostMapping(value = "/deploy")
    public String deploy(@RequestParam("file") MultipartFile file) {
        try {
            return service.deploy(file.getOriginalFilename(), file.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("upload failed");
        }
    }
}

這裏以文件名做爲部署的名稱,能夠根據實際狀況指定名稱。spring

測試(能夠經過postman進行測試,這裏使用curl工具進行上傳測試)
curl -X POST -F 'file=@WechatIMG1.jpeg' http://localhost:8080/deploy
25001

返回的25001就是部署id。segmentfault

當執行deploy操做時,activiti後臺作了如下事api

  • 在表ACT_RE_DEPLOYMENT建立一條記錄
  • 將資源存儲至表ACT_GE_BYTEARRAY,字段BYTES_存儲文件內容

流程部署

流程部署和資源部署同樣,但有一點須要注意,部署流程時,資源的名稱必須以bpmn20.xml或者bpmn結尾,不然activiti會看成普通資源上傳,你能夠在controller上加個判斷避免用戶上錯錯誤文件。springboot

@PostMapping(value = "/deployBpmn")
public String deployBpmn(@RequestParam("file") MultipartFile file) {
    try {
        String name = file.getOriginalFilename();
        if (!name.endsWith(".bpmn20.xm") && !name.endsWith(".bpmn")) {
            name = name + ".bpmn";
        }
        return service.deploy(name, file.getInputStream());
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException("upload failed");
    }
}

當部署流程後,activit後臺除了執行部署資源的動做外,還額外執行如下動做bash

  • 在表ACT_RE_PROCDEF上建立一條記錄,引用deployment_id

流程部署優化

以上咱們實現了流程的部署,但每次部署都會致使流程版本遞增,咱們的方案是若是文件不發生變化則不執行部署操做,保持流程版本好不變,不至於讓版本號升的太快,也節省系統資源。那麼咱們須要完成如下兩個邏輯app

  • 根據key查詢到最新的一次部署
  • 獲取最新的一次流程源文件
  • 由於xml是文本文件,咱們能夠進行文本比對,若是內容一致就認爲版本不變

代碼以下:curl

/**
 * deploy resource
 *
 * @param name resource name
 * @param fin  resource inputstream
 * @return
 */
public String noChangeNoDeploy(String name, InputStream fin) {
    //獲取最新的一次部署
    Deployment latestDeployment = repositoryService.createDeploymentQuery()
            .deploymentName(name)
            .deploymentKey(name)
            .latest()
            .singleResult();
    String sbpmn = ActivitiUtil.text(fin);
    if (latestDeployment != null) {
        //檢測是否內容發生變化,只從新部署有修改的流程
        InputStream input = repositoryService.getResourceAsStream(latestDeployment.getId(), name);
        String dbpmn = ActivitiUtil.text(input);
        if (sbpmn.length() == dbpmn.length() && sbpmn.equals(dbpmn)) {
            return latestDeployment.getId();
        }
    }
    String deploymentId = repositoryService.createDeployment()
            .addString(name, sbpmn)
            .name(name)
            .key(name)
            .deploy()
            .getId();
    return deploymentId;
}

測試:

curl -X POST -F 'file=@ComplexDemo.bpmn20.xml' http://localhost:8080/deployBpmn
27501
curl -X POST -F 'file=@ComplexDemo.bpmn20.xml' http://localhost:8080/deployBpmn                                                                
27501

能夠看到,若是兩次內容同樣deployid不會改變

其餘

除了經過addInputStream增長資源文件外,RepositoryService還提供了其餘api進行資源的添加。以下

DeploymentBuilder addInputStream(String resourceName, InputStream inputStream);
DeploymentBuilder addClasspathResource(String resource);
DeploymentBuilder addString(String resourceName, String text);
DeploymentBuilder addBytes(String resourceName, byte[] bytes);
DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream);
DeploymentBuilder addBpmnModel(String resourceName, BpmnModel bpmnModel);
本文全部代碼已經上傳至github,倉庫地址爲 https://github.com/wls1036/springboot-activiti6-tutorial歡迎star
相關文章
相關標籤/搜索