在上一章節中,介紹瞭如何基於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; } }
部署的時候指定部署的name
和key
,方便後續對部署進行進一步操做。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
代碼以下: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