http://msdn.microsoft.com/zh-cn/library/aa560470(BTS.10).aspx
http://msdn.microsoft.com/zh-cn/library/aa561951(BTS.10).aspx
http://www.blogjava.net/zolly/archive/2009/05/20/RuleEngine.html
http://www.cnblogs.com/muyanpeng/archive/2008/05/08/1188774.html
http://hi.baidu.com/dburu/blog/item/fda69d13f46d51d8f7039ef9.html
http://www.blogjava.net/Jeffery001/archive/2008/11/04/238582.html
http://www.cnblogs.com/linbc/archive/2009/06/29/1512903.html
http://www.cnblogs.com/zhoujg/archive/2006/10/29/543792.aspx
======================================================
http://www.cnblogs.com/muyanpeng/archive/2008/05/07/1187220.html
BizTalk中的業務規則引擎的功能和特點是在不改變流程,不重新部署工程的情況下,動态的配置政策資訊,修改政策邏輯.達到動态的業務配置目的.
舉一個簡單的例子.一個銷售機構銷售一種商品,當該商品的數量小于100的時候不需要運輸部門負責運輸,則不需要通知運輸部門.但是當大于100的時候則需要運輸部門負責運輸.但有的時候這個100的數量是可變的,有的時候是150,有的時候甚至是200. 但是這個數量如果寫在了BizTalk流程裡,就寫死了. 這個時候我們就可以通過業務規則引擎來幫助我們在流程外配置這個屬性.
實作 業務規則引擎DEMO:
訂單的schema:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5iMwATZnFWbp9CXn5WZw5WY5VXbvwVbvN2Xzd2bsJmbj9CXt92YuM3ZvxmYuNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.jpg)
這裡的value代表的是貨物的數量, 業務規則引擎會根據這個數量修改state的值,來确認該訂單是否達到了需要運輸部門運輸的标準. 根據schema 就可以建立業務規則引擎邏輯了,因為業務規則引擎是依賴于schema,而被流程調用的.
打開 ”業務規則編輯器” :
這裡分為政策和事實部分:
事實部分定義的是詞彙,資料庫(資料庫引用),.net 類(Dll引用).詞彙裡定義的一個個屬性可以對應到schema裡的字段,用做業務政策的元素.
這裡可以引用剛才建立的訂單schema的value 和 state 字段,分别進行取值和負值操作.
右鍵 ”詞彙” à ”添加新詞彙”à命名為”testRule”
然後右鍵 ”版本 1.0” à ”添加新定義”
在新的定義中選擇xml文檔元素或屬性,浏覽至剛建立的schema檔案,并選中。
之後展開root節點,選中value之後,在名稱項中寫入value,并選中get操作。
重複上面操作将state節點屬性也選入,并選取set操作。
在詞彙定義的時候 ,可以定義兩種詞彙:get"set 分别代表對該字段屬性取值和對該屬性字段指派的操作。
操作之後的結果
政策是業務規則的邏輯,結構分為條件,和将要執行的操作.可以用詞彙元素作為判斷依據,使用常量謂詞,函數來完成判斷.
這個時候就可以開始定義規則了 :
建立規則版本1.0的内容:
判斷當值的内容小于501的時候,狀态字段改寫為”<500”.
測試目前的規則:
輸出結果:
OK 沒有問題.
RULE ENGINE TRACE for RULESET: testRuleP 2008 - 5 - 7 16 : 16 : 02
FACT ACTIVITY 2008 - 5 - 7 16 : 16 : 03
Rule Engine Instance Identifier: 696d69d5 - 463c - 44bd - aec4 - b6d27a8a1426
Ruleset Name: testRuleP
Operation: Assert
Object Type: TypedXmlDocument:tempSchema
Object Instance Identifier: 45146773
FACT ACTIVITY 2008 - 5 - 7 16 : 16 : 03
Rule Engine Instance Identifier: 696d69d5 - 463c - 44bd - aec4 - b6d27a8a1426
Ruleset Name: testRuleP
Operation: Assert
Object Type: TypedXmlDocument:tempSchema: /* [local - name() = ' Root ' and namespace - uri() = ' http://ruleProject.tempSchema ' ]
Object Instance Identifier: 3667779
CONDITION EVALUATION TEST (MATCH) 2008 - 5 - 7 16 : 16 : 03
Rule Engine Instance Identifier: 696d69d5 - 463c - 44bd - aec4 - b6d27a8a1426
Ruleset Name: testRuleP
Test Expression: TypedXmlDocument:tempSchema: /* [local - name() = ' Root ' and namespace - uri() = ' http://ruleProject.tempSchema ' ].value < 501
Left Operand Value: 1
Right Operand Value: 501
Test Result: True
AGENDA UPDATE 2008 - 5 - 7 16 : 16 : 03
Rule Engine Instance Identifier: 696d69d5 - 463c - 44bd - aec4 - b6d27a8a1426
Ruleset Name: testRuleP
Operation: Add
Rule Name: Rule1
Conflict Resolution Criteria: 0
RULE FIRED 2008 - 5 - 7 16 : 16 : 03
Rule Engine Instance Identifier: 696d69d5 - 463c - 44bd - aec4 - b6d27a8a1426
Ruleset Name: testRuleP
Rule Name: Rule1
Conflict Resolution Criteria: 0
FACT ACTIVITY 2008 - 5 - 7 16 : 16 : 03
Rule Engine Instance Identifier: 696d69d5 - 463c - 44bd - aec4 - b6d27a8a1426
Ruleset Name: testRuleP
Operation: Retract
Object Type: TypedXmlDocument:tempSchema
Object Instance Identifier: 45146773
FACT ACTIVITY 2008 - 5 - 7 16 : 16 : 03
Rule Engine Instance Identifier: 696d69d5 - 463c - 44bd - aec4 - b6d27a8a1426
Ruleset Name: testRuleP
Operation: Retract
Object Type: TypedXmlDocument:tempSchema: /* [local - name() = ' Root ' and namespace - uri() = ' http://ruleProject.tempSchema ' ]
Object Instance Identifier: 3667779
在流程中對規則引擎進行引用:
别忘記首先要引用一個規則引擎的DLL : Microsoft.RuleEngine.dll
流程如下:
規則部分定義: 這裡的參數是流程裡的消息,因為規則引擎的處理是針對消息進行的.
部署工程,測試工程:
綁定接收端口和發送端口:
傳入消息:
< ns0:Root xmlns:ns0 ="http://ruleProject.tempSchema" >
< value > 1 </ value >
< state > 0 </ state >
</ ns0:Root >
傳出消息:
OK 搞定 ;)
<? xml version="1.0" encoding="utf-8" ?>
< ns0:Root xmlns:ns0 ="http://ruleProject.tempSchema" >
< value > 1 </ value >
< state > < 501 </ state >
</ ns0:Root >