10 Flowable-BPMN操作流程部署啟動
- 背景
- 方案設計
- BPMN業務流程檔案
- 服務接口設計
- 部署服務實作
- 啟動服務實作
- 部署控制器
- 啟動控制器
- 部署建立流程驗證
- 運作流程驗證
- Flowable部署啟動流程完整代碼下載下傳
- 打賞
- 版權
背景
本文開始将陸續開始Flowable的API程式設計操作,慢慢掌握Flowable的常見API操作,參考部落格https://blog.csdn.net/houyj1986/article/details/85494233完成開發環境的搭建,下面我們來完成流程的部署和啟動。
方案設計
- Flowable的流程部署通過倉庫服務來完成部署,倉庫服務的接口為
。該接口通過建立RepositoryService
來完成部署DeploymentBuilder
- 部署前我們編輯了一個普通的流程檔案,需要加載下改檔案來防止檔案有錯誤,把檔案轉換為BPMNModel來校驗,核心接口為
,通過API接口BpmnXMLConverter
來實作xml到模型的轉換convertToBpmnModel
- 加載完成流程後,我們将流程啟動,Flowable的啟動接口為
,運作時服務調用runtimeService
啟動一個流程,并且傳回流程對象startProcessInstanceByKey
。該對象包含ID,後續我們将經常用到該ID。ProcessInstance
BPMN業務流程檔案
還是使用簡單流程來完成業務流程的學習,目前流程隻包含一個開始節點/使用者任務節點/結束節點。給使用者任務節點配置一個配置設定人為admin.如下圖所示:
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>
服務接口設計
有了xml之後,我們設計web的服務層接口如下:
/**
* 流程服務類
*/
public interface IFlowService {
/**
* 部署工作流
*/
Map<String,Object> createFlow(String filePath);
/**
* 啟動工作流
*/
ProcessInstance strartFlow(String processKey, Map<String,Object> paras);
}
部署服務實作
部署的代碼實作如下,代碼中我們加入了流程的校驗:
@Override
public Map<String,Object> createFlow(String filePath) {
Map<String,Object> res = new HashMap<>();
//解析BPMN模型看是否成功
XMLStreamReader reader = null;
InputStream inputStream = null;
try {
BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
XMLInputFactory factory = XMLInputFactory.newInstance();
inputStream=new FileInputStream(new File(filePath));
reader = factory.createXMLStreamReader(inputStream);
BpmnModel model = bpmnXMLConverter.convertToBpmnModel(reader);
List<Process> processes = model.getProcesses();
Process curProcess = null;
if (CollectionUtils.isEmpty(processes)) {
log.error("BPMN模型沒有配置流程");
return null;
}
res.put("processes",processes);
curProcess = processes.get(0);
inputStream=new FileInputStream(new File(filePath));
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().name("TEST_FLOW")
.addInputStream(filePath,inputStream);
Deployment deployment= deploymentBuilder.deploy();
res.put("deployment",deployment);
log.warn("部署流程 name:"+curProcess.getName()+" key "+deployment.getKey() + " deploy "+deployment);
return res;
}
catch (Exception e){
log.error("BPMN模型建立流程異常",e);
return null;
}
finally {
try {
reader.close();
} catch (XMLStreamException e) {
log.error("關閉異常",e);
}
}
}
啟動服務實作
啟動服務實作如下,為了防止沒有部署就去啟動,加入了流程是否存在的檢查:
@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);
}
部署控制器
web入口設計簡單,主要啟動服務,并且傳回服務的部署資訊,具體實作如下:
@RequestMapping("/create")
@ResponseBody
public Map<String,Object> createFlow(){
Map<String,Object> res =new HashMap<>();
Map<String,Object> data = new HashMap<>();
String flowPath ="E:\\flowablestudy\\flowablech5\\src\\main\\resources\\flows\\測試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;
}
啟動控制器
啟動控制器實作如下:
@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;
}
部署建立流程驗證
啟動服務後,在浏覽器中輸入http://localhost:8989/flow/create驗證如下:
運作流程驗證
輸入http://localhost:8989/flow/start?processKey=test_bpmnhttp://localhost:8989/flow/start?processKey=test_bpmn驗證如下:
Flowable部署啟動流程完整代碼下載下傳
本文的完整代碼已經請到我的下載下傳中下載下傳。位址:https://download.csdn.net/download/houyj1986/10909860
打賞
如果您覺得該文章對您有幫助,歡迎打賞作者,謝謝。
版權
版權所有,侵權必究,代碼與文章,使用、copy、轉載請聯系作者。由書山登峰人創作。