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

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

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

瘋狂Activiti電子書:https://my.oschina.net/JavaLaw/blog/1570397mysql

工做流Activiti教學視頻:https://my.oschina.net/JavaLaw/blog/1577577git

Activiti運行第一個DMN應用

        前面對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的鏈接屬性。規則引擎有哪些配置,將在下面章節中講述。

編寫DMN文件

        本例中定義一個最簡單的規則,當傳入的年齡參數大於等於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元素做了講解,在此再也不贅述。

加載與運行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

相關文章
相關標籤/搜索