一、 绑定方式 – direct(直接)
直接绑定有MessageBox、Self Correlating、Panter Orchestration等三种模式,之所以这三种模式的绑定会被放在一起叫做直接绑定,是因为这三种模式绑定跟前面介绍过的那些绑定方式有共同的不同点。前面的几种绑定方式在生成的订阅关系中都明确的指定消息的发布服务或者要订阅服务,而Orchestration端口的直接绑定不会显式的绑定到某一个特定的物理端口。比如Orchestration端口绑定物理接收端口,订阅条件中会有个BTS.ReceivePortID == {7DA3DB40-8E1B-47DB-AF1B-078E 77F 19372}条件,只接收来自这个物理接收端口接收进来的消息。再比如,Orchestration端口绑定物理发送端口,在物理发送端口的订阅条件中会有个BTS. SPTransportID == {54ECBCE9-AA 7F -4DB1-B2CC-B97CF 5F 8D4CE}这样的条件,只接收明确指定发送到到这个物理发送端口的消息。而MessageBox、Self Correlating、Panter Orchestration等三种模式模式的绑定,它们最终形成的订阅条件中不会出现BTS.ReceivePortID等于多少,BTS. SPTransportID等于多少这样的明确指定发布服务和订阅服务的限制。
MessageBox直接绑定,比较容易理解,消息直接发布到messagebox,消息肯定要经过MessageBox数据库。但是Self Correlating、Panter Orchestration这两种模式,看上去都是消息从一个orchestration直接到另一个orchestration,消息是不是就不经过MessageBox数据库了?
实际上,通过任何种类的逻辑端口发送的任何消息都是要经过MessageBox数据库,都是在biztalk消息订阅发布和路由机制的控制下进行工作的。
1、 MessageBox
MessageBox直接绑定,就是消息发布服务不指定明确的消息接收服务,把带着上下文属性的消息直接发送到messagebox,发布到messagebox的消息一定要有至少一个订阅者,如果消息没有匹配到任何订阅者,biztalk会抛出异常,提示此消息没有订阅者,发布此消息的服务将被挂起。订阅服务也不明确指定消息发布服务,只规定接收具有哪些属性的消息,当消息发送到messagebox由消息代理把消息路由到合适的订阅服务那里。
本测试示例代码下载:BindingDirectMessageBox.rar
1.1. 测试场景
在一个文件夹中有个消息,类似这样:
<ns0:Root xmlns:ns0="http://BindingDirectMessageBox.InputSch">
<flag>new</flag>
<num>10</num>
</ns0:Root>
读取此消息到orchestration,在orchestration中根据num元素的值决定消息的流向。flag元素有三个可能的值:
new – 表示最初的消息
accept – 被系统接受后的值
reject – 被系统拒绝后的值
首先file适配器从指定的文件夹读取flag为new的消息,orchestration的接收端口接收flag为new的消息,如果num小于100就把此消息发送到Reject目录,如果大于等于100就把此消息发送到Accept目录。
1.2. 项目设计
首先,设计消息架构,本示例全部采用MessageBox直接绑定,消息在传送过程中依靠flag字段的值作为各个订阅服务的条件值,所以这个字段设置为升级字段。为了在orchestration中访问方便,Num字段设置为可分辨字段。
设计流程如图:
Figure 16. MessageBox直接绑定测试流程
配置orchestration
Port_Receive接收端口配置为直接绑定MessageBox,这个端口接收消息的订阅条件是在跟Port_Receive相连的接受形状(activate属性为true)的Filter Expression属性设置,如下图:
Figure 17. MessageBox直接绑定接收形状订阅条件设置
BindingDirectMessageBox.Flag属性是升级的消息中的flag元素,这样的设置表示这个端口接收消息中BindingDirectMessageBox.Flag属性必须为“new”。
直接绑定接收端口,订阅消息的条件中总是包含一个对应接收形状指定的消息类型的条件。跟Filter Expression属性设定的条件共同构成消息订阅的条件。
如果接收形状的消息类型为XmlDocument或者Microsoft.XLANGs.BaseTypes.Any类型,这些类型为不确定类型,将导致订阅条件中不包含消息类型的条件。如果同时没有设置别的过滤条件,那么这个端口的订阅条件将为空,订阅谓词表中也不会有这个订阅的记录,无法匹配入站的消息,因此这样的订阅不会接收到任何消息。
直接绑定接收端口的过滤条件设置的越细致越好,严格的限定在这个端口真正需要接收的消息,如果设定的过滤条件比较宽泛,容易接收到不是你想要的消息。
Decide形状根据num字段的值,大于等于100控制转向ConstructAccept构造形状,这里构造同类型的输出消息,把BindingDirectMessageBox.Flag属性的值改为“accept”,小于100时,BindingDirectMessageBox.Flag属性的值改为“reject”。
Port_Send发送端口也被设置为接绑定MessageBox,把修改了BindingDirectMessageBox.Flag属性的消息直接发送到MessageBox。
配置物理端口
编译部署项目。
在biztalk控制台,打开在刚才部署的应用程序
l 新建接收端口单向
在这个接收端口下建一个接收位置,选FILE适配器,URI指向要接收消息的那个文件夹。接收管道选XMLReceive,一定要选XMLReceive管道,因为消息中有需要升级的属性,XMLReceive管道能在管道中根据消息架构设置的升级属性把消息的相关属性升级到消息上下文。
l 新建Accept发送端口
这个端口用来订阅消息的BindingDirectMessageBox.Flag属性的值改为“accept”的消息。
在发送端口处新建一个静态单向发送端口,选FILE适配器,URI指向要通过的消息要发送的那个文件夹Accept。在过滤条件中设置:BindingDirectMessageBox.Flag == accept
l 新建Reject发送端口
这个端口用来订阅消息的BindingDirectMessageBox.Flag属性的值改为“reject”的消息。
在发送端口处再新建一个静态单向发送端口,选FILE适配器,URI指向要通过的消息要发送的那个文件夹Reject。在过滤条件中设置:BindingDirectMessageBox.Flag == reject
1.3. 查看订阅
先查看orchestration直接绑定接收端口产生的订阅条件:
Subscription:
{
ORGroup0
{
http://BindingDirectMessageBox.PropertySch.Flag == new
And
BTS.MessageType == http://BindingDirectMessageBox.InputSch#Root
}
}
一个条件是在Filter Expression属性设置的消息中的升级属性flag的值为new,另一个条件为消息类型为接受形状的消息类型。
再看两个物理发送端口产生的订阅条件:
Subscription:
{
ORGroup0
{
BTS.SPTransportID == {86943E76-1D57-43AD-968B -6F 8B36202ECC}
Or
http://BindingDirectMessageBox.PropertySch.Flag == reject
}
}
消息中的升级属性flag的值为reject是在端口的Filter中设置的接收条件,BTS.SPTransportID这个条件是发送端口总是自带的一个条件,这两个条件为OR的关系。
特别注意:
直接绑定接收端口有一点需要特别注意,比如接收消息的订阅条件为某个消息类型,加上消息中的某个升级属性,在orchestarion中处理这个消息后,把处理好的这个消息发送到某个物理端口。这是如果不把订阅条件中的那个属性修改其他值,那么这个消息发布到messagebox后,不但会被物理发送端口,还会被这个直接绑定接收端口再次接收回来,因为这个消息依然符合直接绑定接收端口的订阅条件,从而形成无穷循环。
处理后的消息一定要把订阅条件中的那个属性修改其他值,或者输出消息转换为其他类型的消息。