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://i-blog.csdnimg.cn/blog_migrate/1effb6d12a36ec712d6bccdb7d617390.jpeg)
这里的value代表的是货物的数量, 业务规则引擎会根据这个数量修改state的值,来确认该订单是否达到了需要运输部门运输的标准. 根据schema 就可以建立业务规则引擎逻辑了,因为业务规则引擎是依赖于schema,而被流程调用的.
打开 ”业务规则编辑器” :
![](https://i-blog.csdnimg.cn/blog_migrate/d5142188c72e0ff6babf576ce03965c6.jpeg)
这里分为策略和事实部分:
事实部分定义的是词汇,数据库(数据库引用),.net 类(Dll引用).词汇里定义的一个个属性可以对应到schema里的字段,用做业务策略的元素.
这里可以引用刚才建立的订单schema的value 和 state 字段,分别进行取值和负值操作.
右键 ”词汇” à ”添加新词汇”à命名为”testRule”
然后右键 ”版本 1.0” à ”添加新定义”
![](https://i-blog.csdnimg.cn/blog_migrate/ca95e7d7ad863230d34795b064a6a8c7.jpeg)
在新的定义中选择xml文档元素或属性,浏览至刚建立的schema文件,并选中。
之后展开root节点,选中value之后,在名称项中写入value,并选中get操作。
重复上面操作将state节点属性也选入,并选取set操作。
![](https://i-blog.csdnimg.cn/blog_migrate/5dede1897fbf3a1de9d57fb1ca5291d2.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/7ab4e083ccf1c935bd37f04c7ef42f39.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/5dede1897fbf3a1de9d57fb1ca5291d2.jpeg)
在词汇定义的时候 ,可以定义两种词汇:get"set 分别代表对该字段属性取值和对该属性字段赋值的操作。
操作之后的结果
![](https://i-blog.csdnimg.cn/blog_migrate/8abfa85da8723277d5b04cbe4bc083de.jpeg)
策略是业务规则的逻辑,结构分为条件,和将要执行的操作.可以用词汇元素作为判断依据,使用常量谓词,函数来完成判断.
这个时候就可以开始定义规则了 :
![](https://i-blog.csdnimg.cn/blog_migrate/d61063f2cb3bde5e63b7e19d7bc14c19.jpeg)
创建规则版本1.0的内容:
![](https://i-blog.csdnimg.cn/blog_migrate/926e7d80206710f5025f57905f73fe4b.jpeg)
判断当值的内容小于501的时候,状态字段改写为”<500”.
测试当前的规则:
![](https://i-blog.csdnimg.cn/blog_migrate/b49dc30bb67ce790ba80534fcc59a5bd.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/15abfd20a544189411d1da20d30dc851.jpeg)
输出结果:
OK 没有问题.
RULE ENGINE TRACE
for
RULESET: testRuleP
2008
-
5
-
7
16
:
16
:
02
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
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
流程如下:
![](https://i-blog.csdnimg.cn/blog_migrate/e588412cfb5411464d92b37bc36b9a4a.jpeg)
规则部分定义: 这里的参数是流程里的消息,因为规则引擎的处理是针对消息进行的.
![](https://i-blog.csdnimg.cn/blog_migrate/c0a771824d94af048f827e65ad84c90c.jpeg)
部署工程,测试工程:
绑定接收端口和发送端口:
传入消息:
<
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
>