瘋狂Activiti6.0連載(14)Activiti運行第一個DMN應用

  本文節選自《瘋狂工作流講義(第2版)》

京東購買地址:https://item.jd.com/12246565.html

工作流Activiti6電子書http://blog.csdn.net/boxiong86/article/details/78488562

工作流Activiti6教學視頻http://blog.csdn.net/boxiong86/article/details/78608585

Activiti運行第一個DMN應用

前面對DMN規範作了一個簡單的講解,本小節將帶領大家開發第一個Activiti的規則項目,目的讓大家對Activiti的規則引擎有一個初步瞭解,在成功運行第一個規則項目後,對DMN規範以及ActivitiDMN實現就不會感覺神祕。

建立項目

與本書前面章節的項目一樣,新建一個普通的Java項目,後綴爲.dmn的文件存放在resource/dmn目錄,同樣依賴common-lib/lib目錄(不包括子目錄)下的jar包。除了依賴Activitijar包外,由於規則引擎使用了liquimvel等項目,因此還要導入這些項目的包,項目結構以及所使用的jar包如圖15-1所示。


15-1項目結構

需要注意的是,在導入common-lib/lib的包時,不要把源代碼的包也導入到項目中,例如把規則引擎的源代碼包(activiti-dmn-engine-6.0.0-sources.jar)導到環境中,在運行時,會出現以下異常:org.activiti.dmn.engine.ActivitiDmnException: Error initialising dmn data model

15-1中的resource目錄,有一份activiti.dmn.cfg.xml的配置文件,該文件包含規則引擎的基礎配置,我們將在後面章節中講述。

規則引擎配置文件

在默認情況下,規則引擎會讀取ClassPath下的activiti.dmn.cfg.xml,對於該文件,大家可能覺得比較熟悉,這個文件名,就是流程引擎配置文件的名稱中間加入了dmn字母。而相對於配置文件的內容,幾乎也是與流程引擎一樣。代碼清單15-7是本例中所使用的配置文件。

代碼清單15-7codes\15\15.3\first-dmn\resource\activiti.dmn.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

 

<bean id="dmnEngineConfiguration"

class="org.activiti.dmn.engine.impl.cfg.StandaloneDmnEngineConfiguration">

<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />

<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />

<property name="jdbcUsername" value="root" />

<property name="jdbcPassword" value="123456" />

</bean>

 

</beans>

規則引擎的配置文件,幾乎與流程引擎的配置文件一樣,配置一個dmnEngineConfigurationbean,爲該bean設置JDBC的連接屬性。規則引擎有哪些配置,將在下面章節中講述。

編寫DMN文件

本例中定義一最簡單的規則,當傳入的年齡參數大於等於18時,就返回“成年人”字符串,如果年齡參數小於18,就返回“小孩”字符串。代碼清單15-8爲本例的規則文件。

代碼清單15-8codes\15\15.3\first-dmn\resource\dmn\first.dmn

<?xml version="1.0" encoding="UTF-8"?>

<definitions xmlns="http://www.omg.org/spec/DMN/20151130"

id="simple" name="Simple" namespace="http://activiti.org/dmn">

<decision id="decision1" name="Simple decision">

<decisionTable id="decisionTable">

<input id="input1">

<inputExpression id="inputExpression1" typeRef="number">

<text>personAge</text>

</inputExpression>

</input>

<output id="outputId" label="Output 1" name="myResult" typeRef="string" />

<rule>

<inputEntry id="inputEntry2">

<text><![CDATA[ >= 18 ]]></text>

</inputEntry>

<outputEntry id="outputEntry2">

<text>'成年人'</text>

</outputEntry>

</rule>

<rule>

<inputEntry id="inputEntry1">

<text><![CDATA[ < 18 ]]></text>

</inputEntry>

<outputEntry id="outputEntry1">

<text>'小孩'</text>

</outputEntry>

</rule>

</decisionTable>

</decision>

</definitions>

規則文件中,定義了一個輸入參數、一個輸出結果和兩個規則,在前面章節已經對相關的DMN元素作了講解,在此不再贅述。

加載與運行DMN文件

兩個引擎不僅僅在配置上類似,連API的使用也非常相似。如果在本書前面的章節中,熟練掌握了Activiti工作流引擎的API,那麼在學習使用規則引擎的API也不會太難。代碼清單15-9中爲規則的運行代碼。

代碼清單15-9codes\15\15.3\first-dmn\src\org\crazyit\activiti\FirstDmn.java

public class FirstDmn {

 

public static void main(String[] args) {

//根據默認配置創建引擎的配置實例

DmnEngineConfiguration config = DmnEngineConfiguration

.createDmnEngineConfigurationFromResourceDefault();

//創建規則引擎

DmnEngine engine = config.buildDmnEngine();

//獲取規則的存儲服務組件

DmnRepositoryService rService = engine.getDmnRepositoryService();

//獲取規則服務組件

DmnRuleService ruleService = engine.getDmnRuleService();

//進行規則 部署

DmnDeployment dep = rService.createDeployment()

.addClasspathResource("dmn/first.dmn").deploy();

//進行數據查詢

DmnDecisionTable dt = rService.createDecisionTableQuery()

.deploymentId(dep.getId()).singleResult();

//初始化參數

Map<String, Object> params = new HashMap<String, Object>();

params.put("personAge", 19);

//傳入參數執行決策,並返回結果

RuleEngineExecutionResult result = ruleService.executeDecisionByKey(

dt.getKey(), params);

//控制檯輸出結果

System.out.println(result.getResultVariables().get("myResult"));

//重新設置參數

params.put("personAge", 5);

//重新執行決策

result = ruleService.executeDecisionByKey(dt.getKey(), params);

//控制檯重新輸出結果

System.out.println(result.getResultVariables().get("myResult"));

}

}

如代碼清單15-9所示,先讀取默認的配置文件來創建DmnEngineConfiguration實例,以該實例獲取規則引擎DmnEngine實例,再以DmnEngine爲基礎,獲取兩個服務組件:DmnRepositoryServiceDmnRuleServiceDmnRepositoryService主要負責引擎資源的部署,DmnRuleService則提供規則的相關服務,例如可以執行規則、查詢規則等。

代碼清單15-9中,使用了DmnRepositoryServicefirst.dmn規則文件部署到引擎中,再根據部署的id去查詢DmnDecisionTable實例代碼清單15-9中的粗體字代碼,使用DmnRuleService來執行決策並返回結果,由於我們在DMN文件中配置了,需要有一個名稱爲personAge的輸入參數,因此要新建一個Map實例來保存該參數。

在以上例子中,第一次使用DmnRuleService來執行決策時,傳入的“personAge”參數值爲19,第二次執行決策時,傳入的參數值爲5,運行代碼清單15-9,輸出如下:

成年人

小孩

到此,Activiti的第一個應用已經成功運行,根據本小節可知,規則引擎與流程非常相似,配置的讀取、規則引擎的創建、服務組件的獲取方式、數據查詢以及運行,與Activiti流程引擎如出一轍。如果熟悉Activiti流程引擎的話,規則引擎的API將很快掌握。

 本文節選自《瘋狂Workflow講義(第2版)》

京東購買地址:https://item.jd.com/12246565.html

工作流Activiti6電子書http://blog.csdn.net/boxiong86/article/details/78488562

工作流Activiti6教學視頻http://blog.csdn.net/boxiong86/article/details/78608585

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章