之前写了一篇的《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)》分析一下拆装的过程。

BizTalk开发系列(十八) 使用信封拆分数据库消息的更多相关文章

  1. BizTalk开发系列(十二) Schema设计之Group与Order

    开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档.因此消息的格式为XML Schema(XML Schema 用于描述 XML 文档的结构).虽 ...

  2. BizTalk开发系列(十九) BizTalk命名规范

    目前BizTalk项目的开发人员比较少,但是在开发过程中还是需要命名规范的约束.根据以往BizTalk项目的经验,整理了BizTalk命 名规范.包括:BizTalk Application, Sch ...

  3. BizTalk开发系列(十六) XML命名空间

    BizTalk开发过程中如果有对XML进行开发操作,比如在自定义代码里操作XML消息或者在Mapping的时候使用Xpath对XML进行操 作.则有机会遇到XML命名空间的问题.常见的是使用Xpath ...

  4. BizTalk开发系列(十五) Schema设计之Qualified 与Unqualified

    XML Schema中的命名空间前缀限定包括对元素(Element)或属性(Attribute)的限定,即常见的如 “<ns0:root>...</ns0:root>”之类的格 ...

  5. BizTalk开发系列(十四) XML空白字符(WhiteSpace)

    最近在做一个BizTalk项目,对XML文件的处理很复杂.本来是想找有没有方法可以一次性去除XML文件中节点和属性的值的空格.但是找了很久没有看到相关的方法.如果有知道该方法的麻烦跟我讲一下:cbcy ...

  6. BizTalk开发系列(十) ESB Guidance安装笔记

    ESB指导工具包(ESB Guidance)是一个运行于BizTalk Server 2006 R2之上的一个框架.详细信息访问ESB指导工具包社区网站 .源码下载 ESB Guidance的安装过程 ...

  7. BizTalk开发系列(二十八) MSMQ 适配器

    MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间 中的任一 ...

  8. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十八】

    <Web 前端开发精华文章推荐>2013年第六期(总第十八期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  9. BizTalk开发系列(二十二) 开发自定义Map Functoid

    尽管 BizTalk Server 提供许多Functoid以支持一系列不同的操作,但仍可能会遇到需要其他方法的情况.<BizTalk开发系列 Map扩展开发>介绍了通过使用自定义 XSL ...

随机推荐

  1. js String对象

    字符串(String) 字符串(String)使用长度属性length来计算字符串的长度: 在字符串中查找字符串 字符串使用 indexOf() 来定位字符串中某一个指定的字符首次出现的位置: 实例 ...

  2. AngularJS学习之HTML DOM

    1.AngularJS为HTML DOM元素的属性提供了绑定应用数据的指令: 2.ng-disabled指令:直接绑定应用程序数据到HTML的disable属性: <div ng-app=&qu ...

  3. 02_Java语言基础部分【总结】

    1. 数据的输入/输出 标准输入输出流 字符输入: char c = (char)System.in.read(); 字符串输入: BufferedReader buf = new BufferedR ...

  4. js-高级技术

    高级技术: 1.function Person(name,age,job){ this.name=name; this.age=age; this.job=job; } var person=new ...

  5. POJ3368 Frequent values(RMQ线段树)

    题目大概说给一个递增序列,询问区间出现最多的数. 用莫队算法比较直观,虽然应该会T..好像也可以主席树..不过题目给的序列是有序的,因而相同的数会聚在一起. 考虑把序列分成一段一段,使每段都包含极大的 ...

  6. mac mysql

    http://blog.neten.de/posts/2014/01/27/install-mysql-using-homebrew/

  7. java.io包详细解说

    转自:http://hzxdark.iteye.com/blog/40133 hzxdark的博客 我不知道各位是师弟师妹们学java时是怎样的,就我的刚学java时的感觉,java.io包是最让我感 ...

  8. BZOJ1443: [JSOI2009]游戏Game

    如果没有不能走的格子的话,和BZOJ2463一样,直接判断是否能二分图匹配 现在有了一些不能走的格子 黑白染色后求出最大匹配 如果是完备匹配,则无论如何后手都能转移到1*2的另一端,故先手必输 否则的 ...

  9. Redis_master-slave模式

    类似mysql的master-slave模式一样,redis的master-slave可以提升系统的可用性,master节点写入cache后,会自动同步到slave上. 环境: master node ...

  10. FMS Camera对象设置说明

    目录: 1.setQuality(Camera.setQuality方法)2.quality(Camera.quality属性)3.setMode(Camera.setMode方法)4.onActiv ...