瘋狂Activiti6.0連載(13)DMN的XML規範

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

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

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

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

DMN的XML規範

        DMN規範的官方網址爲:http://www.omg.org/spec/DMN/,在官方網站上能夠獲取到DMN的規範文檔、DMN的XML Schema文檔和樣例文檔。筆者已經將以上三份文檔下載,並保存到代碼目錄,如下爲這三份文檔的代碼路徑:網站

  • 規範文檔:codes\15\15.2\DMN規範.pdf
  • XML Schema:codes\15\15.2\dmn.xsd
  • 樣例文檔:codes\15\15.2\example.xml

決策

        在DMN規範中,根節點爲definitions,該節點下能夠出現import、itemDefinition、drgElement等元素,其中drgElement是一個抽象元素,decision元素繼承於drgElement。一個decision表示一次決策,能夠爲它設置name、id、label屬性,按照DMN規範,name屬性是必需的,而其餘屬性則是可選的,但做爲decision的惟一標識,建議id也須要設置。一個definitions下能夠定義0個或多個decision。代碼清單15-2定義了一個decision元素。spa

        代碼清單15-2:codes\15\15.2\decision.dmn.net

<?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">
    </decision>
</definitions>

        一個decision元素由question、allowedAnswers、expression等元素組成,其中expression元素表示決策邏輯,expression是一個抽象元素,DMN規範中,decision元素下的expression可出現0次或1次。code

決策表

        一個decisionTable元素表示一個決策表,decisionTable繼承於expression元素,所以在decision元素下,decisionTable只容許出現0次或1次,這是DMN定義的規範,在Activiti的實現中,decision元素下若是不提供decisionTable,會報出異常。代碼清單15-3定義了一個decisionTable元素以及它的幾個子元素。視頻

        代碼清單15-3:codes\15\15.2\decisionTable.dmnxml

<?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/>
            <output/>
            <rule></rule>
        </decisionTable>
    </decision>
</definitions>

        根據 DMN規範,一個decision下最多隻有一個decisionTable,雖然規範中定義能夠出現0次,但這樣作就失去了意義,若是不提供decisionTable,Activiti的規則引擎會報出異常,信息爲:java.lang.IllegalArgumentException: no decision table present in decision。

        決策表元素有四個屬性:hitPolicy、aggregation、preferredOrientation和outputLabel,其中hitPolicy屬性用於定義規則衝突策略。

        元素decisionTable下的input、output和rule子元素,能夠出現屢次,其中規範中定義了output元素最少出現一次,也就是意味在規範中,一次業務決策必須產出一個結果。在Activiti的初步實現中,decisionTalbe元素下,input、output和rule三個子元素都必須出現一次。

 

輸入參數

        在decisionTable元素下,能夠添加多個input元素來聲明輸入參數,爲input元素增長inputExpression元素來聲明輸入參數的類型以及名稱等信息,代碼清單15-4中定義了輸出參數。

        代碼清單15-4:codes\15\15.2\input.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="inputId">
                <inputExpression id="inputExpressionId" typeRef="string">
                    <text>personName</text>
                </inputExpression>
            </input>
            <output/>
            <rule></rule>
        </decisionTable>
    </decision>
</definitions>

        代碼清單15-4定義了一個參數名稱爲「personName」的輸入參數,類型字符串。須要注意的,參數名是persionName,而不是inputId。

 

輸出結果

        每一個決策表至少有一個輸出結果,使用output元素定義輸出參數的名稱以及數據類型。代碼清單15-5定義了輸出結果。

        代碼清單15-5:codes\15\15.2\output.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="inputId">
                <inputExpression id="inputExpressionId" typeRef="string">
                    <text>personName</text>
                </inputExpression>
            </input>
            <output id="resultId" label="Output 1" name="resultName" typeRef="string" />
            <rule></rule>
        </decisionTable>
    </decision>
</definitions>

        代碼清單15-5的粗體字代碼,定義了一個名稱爲「resultName」的輸出結果,類型爲字符串類型。須要注意的是,獲取結果時,要根據name屬性來獲取,而不是id屬性。

 

規則

        在決策表元素下能夠定義多個rule元素,rule元素下能夠添加inputEntry與outputEntry元素,其中inputEntry元素下支持使用MVEL表達式來實現業務規則的判斷邏輯,而outputEntry元素則表示規則結果的輸出,一個rule下能夠出現0個或多個inputEntry,而outputEntry最少出現1次。代碼清單15-6中定義兩個rule。

        代碼清章15-6:codes\15\15.2\rule.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" hitPolicy="UNIQUE">
            <input id="input1">
                <inputExpression id="inputExpression1" typeRef="number">
                    <text>personAge</text>
                </inputExpression>
            </input>
            <input id="input2">
                <inputExpression id="inputExpression2" typeRef="string">
                    <text>personName</text>
                </inputExpression>
            </input>
            <output id="outputId" label="Output 1" name="myResult" typeRef="string" />
            <rule>
                <inputEntry id="inputEntry2">
                    <text><![CDATA[ > 18 ]]></text>
                </inputEntry>
                <inputEntry id="inputEntry2_2">
                    <text><![CDATA[ .equals('Angus') ]]></text>
                </inputEntry>
                <outputEntry id="outputEntry2">
                    <text>'Man Angus'</text>
                </outputEntry>
            </rule>
            <rule>
                <inputEntry id="inputEntry1">
                    <text><![CDATA[ <= 18 ]]></text>
                </inputEntry>
                <outputEntry id="outputEntry1">
                    <text>'Child'</text>
                </outputEntry>
            </rule>
        </decisionTable>
    </decision></definitions>

        代碼清單15-6中,定義了兩個兩個輸入參數、一個輸出結果以及兩個規則,第一規則觸發條件爲第1個參數值大於1八、第2個參數值等於「Angus」,兩個條件都符合時,返回 「Man Angus」字符串。第二個規則觸發條件則是參數1的值小於等於18。

        目前Activiti尚未徹底實現DMN規範,只是有一個大概的輪廓,本書的主要內容爲Activiti,下面將開始介紹Activiti關於DMN規範的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

相關文章
相關標籤/搜索