本文節選自《瘋狂工做流講義(第2版)》html
京東購買地址:https://item.jd.com/12246565.htmljava
瘋狂Activiti電子書:https://my.oschina.net/JavaLaw/blog/1570397mysql
工做流Activiti教學視頻:https://my.oschina.net/JavaLaw/blog/1577577git
前面對DMN規範做了一個簡單的講解,本小節將帶領你們開發第一個Activiti的規則項目,目的讓你們對Activiti的規則引擎有一個初步瞭解,在成功運行第一個規則項目後,對DMN規範以及Activiti的DMN實現就不會感受神祕。spring
與本書前面章節的項目同樣,新建一個普通的Java項目,後綴爲.dmn的文件存放在resource/dmn目錄,一樣依賴common-lib/lib目錄(不包括子目錄)下的jar包。除了依賴Activiti的jar包外,因爲規則引擎使用了liqui、mvel等項目,所以還要導入這些項目的包,項目結構以及所使用的jar包如圖15-1所示。sql
圖15-1 項目結構學習
須要注意的是,在導入common-lib/lib的包時,不要把源代碼的包也導入到項目中,例如把規則引擎的源代碼包(activiti-dmn-engine-6.0.0-sources.jar)導到環境中,在運行時,會出現如下異常:org.activiti.dmn.engine.ActivitiDmnException: Error initialising dmn data model。ui
圖15-1中的resource目錄,有一份activiti.dmn.cfg.xml的配置文件,該文件包含規則引擎的基礎配置,咱們將在後面章節中講述。spa
在默認狀況下,規則引擎會讀取ClassPath下的activiti.dmn.cfg.xml,對於該文件,你們可能以爲比較熟悉,這個文件名,就是流程引擎配置文件的名稱中間加入了dmn字母。而相對於配置文件的內容,幾乎也是與流程引擎同樣。代碼清單15-7是本例中所使用的配置文件。.net
代碼清單15-7:codes\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>
規則引擎的配置文件,幾乎與流程引擎的配置文件同樣,配置一個dmnEngineConfiguration的bean,爲該bean設置JDBC的鏈接屬性。規則引擎有哪些配置,將在下面章節中講述。
本例中定義一個最簡單的規則,當傳入的年齡參數大於等於18時,就返回「成年人」字符串,若是年齡參數小於18,就返回「小孩」字符串。代碼清單15-8爲本例的規則文件。
代碼清單15-8:codes\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元素做了講解,在此再也不贅述。
兩個引擎不單單在配置上相似,連API的使用也很是類似。若是在本書前面的章節中,熟練掌握了Activiti工做流引擎的API,那麼在學習使用規則引擎的API也不會太難。代碼清單15-9中爲規則的運行代碼。
代碼清單15-9:codes\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爲基礎,獲取兩個服務組件:DmnRepositoryService和DmnRuleService。DmnRepositoryService主要負責引擎資源的部署,DmnRuleService則提供規則的相關服務,例如能夠執行規則、查詢規則等。
代碼清單15-9中,使用了DmnRepositoryService將first.dmn規則文件部署到引擎中,再根據部署的id去查詢DmnDecisionTable實例。代碼清單15-9中的粗體字代碼,使用DmnRuleService來執行決策並返回結果,因爲咱們在DMN文件中配置了,須要有一個名稱爲personAge的輸入參數,所以要新建一個Map實例來保存該參數。
在以上例子中,第一次使用DmnRuleService來執行決策時,傳入的「personAge」參數值爲19,第二次執行決策時,傳入的參數值爲5,運行代碼清單15-9,輸出以下:
成年人 小孩
到此,Activiti的第一個應用已經成功運行,根據本小節可知,規則引擎與流程很是類似,配置的讀取、規則引擎的建立、服務組件的獲取方式、數據查詢以及運行,與Activiti流程引擎一模一樣。若是熟悉Activiti流程引擎的話,規則引擎的API將很快掌握。
本文節選自《瘋狂工做流講義(第2版)》
京東購買地址:https://item.jd.com/12246565.html
瘋狂Activiti電子書:https://my.oschina.net/JavaLaw/blog/1570397
工做流Activiti教學視頻:https://my.oschina.net/JavaLaw/blog/1577577
本書代碼目錄:https://gitee.com/yangenxiong/CrazyActiviti