本文節選自《瘋狂工做流講義(第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規範的官方網址爲:http://www.omg.org/spec/DMN/,在官方網站上能夠獲取到DMN的規範文檔、DMN的XML Schema文檔和樣例文檔。筆者已經將以上三份文檔下載,並保存到代碼目錄,如下爲這三份文檔的代碼路徑:網站
在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