之前写了一篇的《BizTalk开发系列(十七) 信封架构(Envelop)》 是关于信封架构及其拆装原理的,都是理论性的内容。信封在BizTalk开发过程中最常用的应该是在读取SQL Server 数据库的时候。一次性读取多条消息,提高了SQL Adapter对SQL Server的读取性能。今天就来做一下这个实例,增强对信封消息的理解。
数据库采用的是SQL Server 2005示例数据库:AdventureWorks 通过select * from Production.Culture选择所有的Cluster信息。如下图所示:
创建表架构和信封架构
创建BizTalk项目之后,根据生成架构向导生成数据库中表架构。在架构信息中的目标命名空间和文档根节点中依下图分别输入相应的值。
在类型中选择SQL脚本,在脚本编辑窗口输入如下脚本(表示将表列名映射为架构中的元素):
select * from Production.Culture for xml auto,elements
架构生成向导会生成架构文件,内容如下。同时也会产生一个声明了此类型的Orchestration,可以将此Orchestration删除。
需要修改生成的Schema.将Production.Culture节点下的所有元素提升到根节点下。根节点修改为:Production.Culture。最后将子节点的Production.Culture删除。修改后的内容如下:
修改了表架构,现在需要另外创建一个信封架构。信封架构设计需要注意几点:1. 命令空间跟表架构保持一致。2.根节点必须为:EnvelopRoot。当然这两点也不一定非得都遵从。如果你已经很清楚了信封的原理则应该知道为什么要这么做和如何根据需要进行修改。
信封架构的创建比较简单。创建一个架构,目标命名空间跟表架构一致,信封属性设置为 Yes。将根节点名称修改为:EnvelopRoot。在根节点的属性中修改根节点的数据构造类型设置为:xs:anyType(注:anyType为 Schema中所有类型的基类,类似于C#中的System.Object)。在设置根节点BodyXpath的对话框中选择EnvelopRoot。
部署项目,创建接收端口和订阅发送端口
两个Schema创建好之后就可以部署项目了。在部署项目之前需要设置程序集密钥,应用程序名称。部署项目之 后可以新建接收端口:ReceiveSQLRecords 参照下图配置SQL接收位置。注意Document Root Elemnt Name的值要与信封架构的根节点值一致。Document Target Namesapce值也要与信封,表架构的目标命名空间一致。接收管道选择系统内置的:XMLRecive
新建发送端口,在发送端口的Filter选项中定义过滤规则为:BTS.ReceivePortName == ReceiveSQLRecords。
测试
启动BizTalk项目,在发送位置的文件夹会生成经过拆分的消息。由于BizTalk在读取数据之后没有对数据库的记录进行删除操作所以每次 BizTalk SQL Adapter轮询的时候SQL脚本都能取到消息。以至于不断的生成消息到目标文件夹中。需要关闭端口或应用程序。
总结
通过架构拆分数据库记录是信封使用的经典案例。我们将接收管道改为:PassThruReceive。可以得到从数据库生成的原始消息,如下图。当然如果你有兴趣的话可以结合:《BizTalk开发系列(十七) 信封架构(Envelop)》分析一下拆装的过程。