Camunda流程引擎入門-在Java中調用DMN決策
camunda在網上的資料不多,大多是原文,我這邊就只針對Camunda的DMN決策概述一下,其他像是Camunda對比其他工作流引擎的性能對比也是個可以探討的議題
Camunda 簡介
Camunda BPM 是一個輕量級的開源工作流和決策自動化平台。它提供了一個符合業務流程模型和符號 (BPMN) 標準的工作流引擎和一個符合決策模型和符號 (DMN) 標準的決策引擎,它們可以通過 REST 嵌入到 Java 應用程序和其他語言中。
執行Bpmn2.0標準,因此依賴於基於bpmn的流程圖(本質上是一個xml文件),所以Java專案中一定會看到副檔名為.bpmn的文件,若是專案中有崁入DMN決策表則也會看到.dmn的xml文件。
Camunda_DMN 决策
決策模型和符號 (DMN) 是業務決策管理的標準,是一個 Java 庫,可以評估基於 DMN 1.1 OMG 標準的決策表。它可以用作嵌入在應用程序中的庫或與 Camunda BPM 平台結合使用,以便業務用戶可以定義和維護直接與工作流引擎集成的可執行業務規則。
實作 Spring boot 調用DMN決策表
我們使用BMI健康狀況作為案例,在這小實作會學會:
- Spring boot的pom.xml的基本配置
- 創建一個DMN決策表並部署到流程引擎中(但是只是學怎樣用至於在Camunda Modeler該怎樣畫又是另一回事,我結論會說出心得)
以下步驟省略了Camnuda安裝等細節,詳細可以參考Camunda官網(https://camunda.com/)
專案資料夾結構(請先忽略我的取名,因為這是一個練習而後延伸的專案,所以我的確一開始在練習是借貸相關的):
step1:建 Camunda Spring Boot專案
首先打開你喜歡的 IDE,新建一個空的Maven項目
step2:配置 Maven 依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>loan-approval-spring-boot</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<camunda.spring-boot.version>7.15.0</camunda.spring-boot.version>
<spring-boot.version>2.4.4</spring-boot.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
<version>${camunda.spring-boot.version}</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
step3:自定義管理員賬戶
讓我們在 src/main/resources 下創建 application.yaml文件,輸入如下內容:
server:
port: 8081
camunda.bpm:
admin-user:
id: demo123456
password: demo123456
firstName: Demo123456
filter:
create: All tasks
step4:新建一個 DMN 決策表
啟動 Camunda Modeler,點擊工具欄最左側的新建按鈕,新建一個 DMN,編輯完成後,將流程保存到JAVA專案的 src/main/resources目錄下。
確保Hit Policy(命中策略)為“UNIQUE(唯一)”,在“唯一”模式下,只有所有規則都是互斥的,一個輸入只能匹配一種規則。
延伸閱讀 命中策略規則
最終效果如下:
配置DMN決策
點擊畫布上默認的DMN決策表,修改在右側的屬性面板中的id為 bmiClassification123
,Name為 BMI Classification
step5:在JAVA中調用DMN決策表
package org.example.loanapproval;
//import...
@SpringBootApplication
@EnableProcessApplication
public class WebappExampleProcessApplication {
protected final static Logger LOGGER = Logger.getLogger(WebappExampleProcessApplication.class.getName());
public static void main(String... args) {
SpringApplication.run(WebappExampleProcessApplication.class, args);
}
@Autowired
private RuntimeService runtimeService;
@EventListener
private void processPostDeploy(PostDeployEvent event) {
DecisionService decisionService = event.getProcessEngine().getDecisionService();
// 輸入參數
VariableMap variables = Variables.createVariables()
.putValue("bmi", 20.0);
// 調用
DmnDecisionTableResult dmnDecisionTableResult = decisionService
.evaluateDecisionTableByKey("bmiClassification123", variables);
String result = dmnDecisionTableResult.getSingleEntry();
// 印出結果
LOGGER.log(Level.INFO, "\n\nBMI Classification result is : {0}\n\n", result);
// <<<<
// >>>> 創建新的DMN決策到DRD
DmnDecisionTableResult suggestionResult = decisionService
.evaluateDecisionTableByKey("bmiSuggestion456", variables);
String suggestion = suggestionResult.getSingleEntry();
LOGGER.log(Level.INFO, "\n\nBMI Classification suggestion is : {0}\n\n", suggestion);
// <<<<
}
}
step6:測試一下
compile專案,查看 Spring Boot 印出運行結果,看到:
BMI Classification result is : 正常
就表示執行成功了(因為我上面定義參數bmi為20,這代表正常)
用瀏覽器打開 http://localhost:8081/camunda/app/cockpit/ 使用 demo123456/demo123456 登錄,打開 Decision Definitions,可以找到剛才的流程實例,可以看到判定結果
實作可能碰到的坑
no processes deployed with key 'Process': processDefinition is null
,就在 main/resource下面沒有添加META-INF資料夾,記得還需要在下面加一個空的process.xml檔- 決策表中的id怎樣都對不到
結論
- Camunda BPM 平台雖然在Camunda Modeler為可視化了,但是要能將邏輯的定義充分在Camunda Modeler(工具上的基本元素符號)設計(畫)表現出來。
- 要實現在Camnuda完成所有邏輯不用會JAVA這太難,畢竟介接程式編寫利用 Camunda BPM SDK 編寫 Java 程序,很多的介接還是要自己寫(no need to know any Java -> must know Java)。
- 業務邏輯寫入Camunda的DMN決策表的可行性,我相信98%都可以寫進,那剩下的2%不會寫?無法寫?的風險呢?
- 業務邏輯的分散造成維護遺漏,邏輯可能DMN有,JAVA中的業務邏輯層也有。
所以我覺得至少需要4人(模型設計、前端頁面編寫、後端程式編寫、維運人員)分別使用不同工具進行分工配合達到目的
reference
https://docs.camunda.org/get-started/dmn/model/
https://zhuanlan.zhihu.com/p/376904826
http://hk.noobyard.com/tag/camunda