天天看點

第10篇:Flowable-BPMN操作流程部署、啟動

文章目錄

  • ​​一、背景​​
  • ​​二、方案設計​​
  • ​​2.1. 流程部署​​
  • ​​2.2. 模型的轉換​​
  • ​​2.3. 啟動流程​​
  • ​​三、BPMN業務流程檔案​​
  • ​​3.1. 啟動flowable-idm​​
  • ​​3.2. 啟動flowable-modeler​​
  • ​​3.3. BPMNxml的内容​​
  • ​​四、服務​​
  • ​​4.1. 服務接口設計​​
  • ​​4.2. 部署服務實作​​
  • ​​4.3. 啟動服務實作​​
  • ​​4.4. 部署控制器​​
  • ​​4.5. 啟動控制器​​
  • ​​4.6. 部署建立流程驗證​​
  • ​​4.7. 運作流程驗證​​

一、背景

本文開始将陸續開始Flowable的API程式設計操作,慢慢掌握Flowable的常見API操作

二、方案設計

2.1. 流程部署

  • Flowable的流程部署通過倉庫服務來完成部署,倉庫服務的接口為RepositoryService。該接口通過建立DeploymentBuilder來完成部署

2.2. 模型的轉換

  • 部署前我們編輯了一個普通的流程檔案,需要加載下改檔案來防止檔案有錯誤,把檔案轉換為BPMNModel來校驗,核心接口為BpmnXMLConverter,通過API接口convertToBpmnModel來實作xml到模型的轉換

2.3. 啟動流程

  • 加載完成流程後,我們将流程啟動,Flowable的啟動接口為runtimeService,運作時服務調用startProcessInstanceByKey啟動一個流程,并且傳回流程對象ProcessInstance。該對象包含ID,後續我們将經常用到該ID。

三、BPMN業務流程檔案

還是使用簡單流程來完成業務流程的學習,目前流程隻包含一個開始節點/使用者任務節點/結束節點。給使用者任務節點配置一個配置設定人為admin.如下圖所示:

3.1. 啟動flowable-idm

java -jar .\flowable-idm.war      

啟動如下圖所示,預設端口8080:

http://localhost:8080/flowable-idm/      
第10篇:Flowable-BPMN操作流程部署、啟動

3.2. 啟動flowable-modeler

第10篇:Flowable-BPMN操作流程部署、啟動
http://localhost:8080/flowable-modeler/      
第10篇:Flowable-BPMN操作流程部署、啟動
第10篇:Flowable-BPMN操作流程部署、啟動

注:删除權限驗證證後,直接通路​

​http://localhost:8080/flowable-modeler/​

​即可

3.3. BPMNxml的内容

  • 如下:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
  <process id="test_bpmn" name="測試BPMN模型" isExecutable="true">
    <documentation>測試BPMN模型</documentation>
    <startEvent id="start" name="開始"></startEvent>
    <endEvent id="end" name="結束"></endEvent>
    <userTask id="testUser" name="使用者任務測試" flowable:assignee="admin">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-8D834F3C-45A8-4C88-9AD1-1AC426CC9002" sourceRef="start" targetRef="testUser"></sequenceFlow>
    <sequenceFlow id="sid-AB59612A-1B33-4FB8-8758-5D773EDF9C44" sourceRef="testUser" targetRef="end"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_test_bpmn">
    <bpmndi:BPMNPlane bpmnElement="test_bpmn" id="BPMNPlane_test_bpmn">
      <bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
        <omgdc:Bounds height="30.0" width="30.0" x="210.0" y="60.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end">
        <omgdc:Bounds height="28.0" width="28.0" x="525.0" y="61.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="testUser" id="BPMNShape_testUser">
        <omgdc:Bounds height="80.0" width="100.0" x="315.0" y="35.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-8D834F3C-45A8-4C88-9AD1-1AC426CC9002" id="BPMNEdge_sid-8D834F3C-45A8-4C88-9AD1-1AC426CC9002">
        <omgdi:waypoint x="239.94999779398907" y="75.0"></omgdi:waypoint>
        <omgdi:waypoint x="315.0" y="75.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-AB59612A-1B33-4FB8-8758-5D773EDF9C44" id="BPMNEdge_sid-AB59612A-1B33-4FB8-8758-5D773EDF9C44">
        <omgdi:waypoint x="414.9499999999903" y="75.0"></omgdi:waypoint>
        <omgdi:waypoint x="525.0" y="75.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>      

四、服務

4.1. 服務接口設計

有了xml之後,我們設計web的服務層接口如下

package com.gblfy.service;

import org.flowable.engine.runtime.ProcessInstance;

import java.util.Map;

/**
 * 流程服務類
 */
public interface IFlowService {
    /**
     * 部署工作流
     */
    Map<String,Object> createFlow(String filePath);


    /**
     * 啟動工作流
     */
    ProcessInstance strartFlow(String processKey, Map<String,Object> paras);
}      

4.2. 部署服務實作

部署的代碼實作如下,代碼中我們加入了流程的校驗:

@Override
public ProcessInstance strartFlow(String processKey, Map<String, Object> paras) {

        if (StringUtils.isEmpty(processKey)){
            return null;
        }

        if (null == paras){
            paras = new HashMap<>();
        }

        Deployment deployment = repositoryService.createDeploymentQuery().processDefinitionKey(processKey).singleResult();

        if (deployment == null){
            log.error("沒有該流程");
            return  null;
        }

        return runtimeService.startProcessInstanceByKey(processKey,paras);
    }
      

4.3. 啟動服務實作

啟動服務實作如下,為了防止沒有部署就去啟動,加入了流程是否存在的檢查:

@Override
public ProcessInstance strartFlow(String processKey, Map<String, Object> paras) {

        if (StringUtils.isEmpty(processKey)){
            return null;
        }

        if (null == paras){
            paras = new HashMap<>();
        }

        Deployment deployment = repositoryService.createDeploymentQuery().processDefinitionKey(processKey).singleResult();

        if (deployment == null){
            log.error("沒有該流程");
            return  null;
        }

        return runtimeService.startProcessInstanceByKey(processKey,paras);
    }
      

4.4. 部署控制器

web入口設計簡單,主要啟動服務,并且傳回服務的部署資訊,具體實作如下:

@RequestMapping("/create")
    @ResponseBody
    public Map<String, Object> createFlow() {
        Map<String, Object> res = new HashMap<>();
        Map<String, Object> data = new HashMap<>();

        String flowPath ="C:\\Users\\gblfy\\Desktop\\Workflow\\flowablestudy\\flowablelech10\\src\\main\\resources\\processes\\測試BPMN模型2.bpmn20.xml";

        Map<String, Object> createRes = flowService.createFlow(flowPath);

        if (null == createRes) {
            res.put("msg", "建立流程失敗");
            res.put("res", "0");
            res.put("data", data);
            return res;
        }
        List<Process> processes = (List<Process>) createRes.get("processes");

        ArrayList<String> ids = new ArrayList<>();
        for (Process process : processes) {
            ids.add(process.getId());
        }
        data.put("processKeys", ids);
        data.put("deployId", ((Deployment) createRes.get("deployment")).getId());
        res.put("data", data);
        res.put("msg", "建立流程成功");
        res.put("res", "1");
        return res;
    }      

4.5. 啟動控制器

啟動控制器實作如下:

@RequestMapping("/start")
    @ResponseBody
    public Map<String, Object> startFlow(@RequestBody @RequestParam(required = false) Map<String, String> paras) {
        Map<String, Object> res = new HashMap<>();
        Map<String, String> data = new HashMap<>();

        if (MapUtils.isEmpty(paras)) {
            res.put("msg", "啟動流程失敗");
            res.put("res", "0");
            res.put("data", data);
            return res;
        }

        String processKey = paras.get("processKey");
        if (StringUtils.isEmpty(processKey)) {
            res.put("msg", "啟動流程失敗");
            res.put("res", "0");
            res.put("data", data);
            return res;
        }

        Map<String, Object> flowParas = new HashMap<>();
        flowParas.putAll(paras);
        ProcessInstance processInstance = flowService.strartFlow(processKey, flowParas);
        if (null == processInstance) {
            res.put("msg", "啟動流程失敗");
            res.put("res", "0");
            res.put("data", data);
            return res;
        }
        data.put("processId", processInstance.getId());
        res.put("msg", "啟動流程成功");
        res.put("res", "1");
        res.put("data", data);
        return res;
    }      

4.6. 部署建立流程驗證

啟動服務後,在浏覽器中輸入​

​http://localhost:8989/flow/create​

​驗證如下:

第10篇:Flowable-BPMN操作流程部署、啟動

4.7. 運作流程驗證

輸入​

​http://localhost:8989/flow/start?processKey=test_bpmn​

​驗證如下:

第10篇:Flowable-BPMN操作流程部署、啟動