BizTalk Server 基于消息的基本数据交换(二) - 使用属性提升 实现根据消息内容的路由及订阅
昨天的事例介绍了最基本的数据交换方式,基于消息的直接订阅。
今天我们来扩充昨天的例子,实现一个稍复杂一些的交换。我们首先把昨天定义的消息,提升一个属性,然后基于这个属性,进行判断,将消息订阅至不同的发送端口。
我们来看下大致流程:
1. 首先查看昨天使用的消息样例Expense。确定提升amount属性,由amount属性数值的不同大小,来判断发送向哪个端口。
2. 我们打开Visual studio,建立一个BizTalk Server项目。
3. 在BizTalk Server项目中,生成XML消息的Schema架构。
4. 编译部署BizTalk Server项目。
5. 打开BizTalk Server管理控制台,配置BizTalk Server项目。设置接收发送端口,设置发送端口订阅条件。
6. 根据订阅条件,编辑两个测试文件进行测试。
OK,流程就是这样,我们大致想象一个场景。
我们需要做的是一个报销流程,用户把报销单Expense,以XML的方式上传,报销单Expense包括两个必要字段,一个是Purpose,报销目的,一个是Amount,报销的总金额。
我们的BizTalk程序,会接收报销单,并且,根据报销单的金额进行判断,如果金额大于10000,我们将这个报销单,发送给财务总监审批,如果小于等于10000,我们直接将报销单发送给其他人员审批。
基于以上场景。我们会设定两个发送端口,一个是发送端口,给财务总监“SendToDirector”,订阅条件包括:报销单中的Amount字段数值大于10000。
另一个发送端口,给财务部其他人员,“SendToOthers”,订阅条件包括:报销单中的Amount字段不大于10000。
报销单中的另一个字段Purpose,暂时不做任何处理。
好的,下面我们开始:
首先回顾一下昨天的XML文件:
然后我们打开Visual Studio 2008 SP1开发环境。我们选择文件File –> 新建New –> 项目Project.
进入新建项目页面,我们选择项目类型为Empty BizTalk Server Project,选择项目路径,填写项目名称ExpenseBTS,点击确定OK
新建项目成功,在解决方案管理器中,我们看到了新建的项目。
然后我们来生成消息文件XML的Schema架构。我们在解决方案管理器中,右键点击ExpenseBTS项目,选择新建New –> 新项目 New Item
在填出的新建窗口中,我们选择Schema,并将文件名改为Expense.xsd。
点击添加 Add。我们看到新的Schema文件生成了。我们编辑Schema文件,首先在Root节点上点击右键,选择插入Schema节点 Insert Schema Node –> 子节点 Child Field Element。
如下图:
然后我们依次进行以下操作:(操作较多,就不逐步截图了)。
1. 将新添加的界面命名为Amount。
2. 在左边树状视图中选择新建的节点Amount。然后再右下方属性框Propertyes 中,找到属性Data Type,将其选择为 xs:int
3. 在左边树状视图中,选择Root节点,右键,再次添加Child Field Element。
4. 将新建节点命名为Purpose。
5. 在左边树状视图中,右键点击 Amount节点,选择提升 Promote –> 快速提升属性 Quick Promotion
6. 点击后,出现如下提示框:点击确定OK。此处提示我们,如果想要进行属性提升,必须添加一个属性构架文件。
我们选择的是快速提升属性,所以系统会自动为我们在项目中添加属性架构文件。
7. 系统进行以下提示:系统提示我们,进行快速属性提升后,我们正在编辑的Schema文件Expense.xsd发生了变化,是否要重新读取。我们选择是YES。
8. 这样,属性提升就完成了,我们可以发现Visual Studio已经打开了两个文件
一个文件是我们新建的:“Expense.xsd”,另一个是新生成的属性架构文件“PropertySchema.xsd”
我们选择Expense.xsd,观察修改后的文件,可以发现,在左边树状视图中的Amount节点的图标发生了变化,多了一个小勋章一样的图标。
这表示该节点已经进行了属性提升。
好的新建XML Schema以及提升属性的操作就完成了。下面我们编译部署我们的BizTalk 项目。
首先,我们在Visual Studio的解决方案管理器中,右键点击项目名ExpenseBTS,选择属性
之后我们就可以看到项目的属性信息页面。我们首先在左边选项卡中选择签名 signing。
进入之后,我们勾选 为组件签名 Sign the assembly。然后再下面的下拉框中选择新建 New。
经过这个操作,VS会为我们的项目进行签名。签名是必须的,因为所有被BizTalk Server调用的DLL必须被部署到GAC中。
而签名是部署到GAC的必要条件。
之后在弹出的对话框中,填写签名文件的文件名KEY,并反选为钱命名文件设置密码的选项。然后点击OK,完成签名。
回到项目属性页面,我们在左端的选项卡中选择部署 Deployment。
在应用程序名 Application Name中填入“Expense”。
经过这个设置,项目被部署之后会自动将组件加入到“Expense”应用程序中。
我们在昨天的文章中已经新建了Expense项目。
如果BizTalk 管理控制台中并没有存在Expense项目,则部署过程中,VS会自动创建Expense项目。
如果存在,则将部署的组件(包括业务流程,映射,架构,等等)加入该项目。
完成设置后,选择保存所有文件。
请注意,必须保存后,再部署项目。
经常有人问到:使用Visual Studio开发BizTalk时,项目属性中的,应用程序名的设置为什么不生效?
一般都是由于没有保存项目属性页造成的。
开发人员一般会认为选择编译或部署,会自动保存所有经过修改的页面。但是在开发BizTalk项目时,选择编译或部署是不会自动保存项目属性页的修改的。
保存之后,我们再Visual Studio的解决方案管理器中,右键选中ExpenseBTS项目,选择部署Deploy。
系统会自动编译程序,并进行部署。等待编译和部署结果。系统报告成功。
好的,关于项目的编辑就搞定了,关掉Visual Studio。打开BizTalk 管理控制台。
找到,展开Expense项目,选择Schema 架构,查看刚刚完成部署的架构 ExpenseBTS.Expense
确认架构已经部署就可以了,如果没看到,可以选择刷新一下。
然后找到我们在上一篇中建立的接收端口。修改接收端口的接收管道。从PassThruReceive变为XMLReceive。
注意:进行本设置的原因是,使用了XMLReceive管道后,系统会自动将Message Type上下文属性提升。
该上下文属性使用了XML文件的目标命名空间 + # + 根节点名称作为消息的唯一类型字符串。
比如本文中定义的架构的Message Type属性就是“http://ExpenseBTS.Expense#Root”这个字符串是识别传入消息架构类型的唯一根据。
也就是说,只有传入XML文件的“目标命名空间 + # + 根节点名称”的值为“http://ExpenseBTS.Expense#Root”的时候,系统才认为
传入的XML文件所属的架构是我们在Visual Studio中编辑的架构。只有这样,我们提升的属性架构才能生效。
而对传入消息的类型属性提升,只有XMLReceive接收端口才能完成。所以此处必须选择XMLReceive。关于管道,以后会有详细的介绍。
没有看上一篇的同事可以自己建立一个文件接收端口,端口名定义为 FileReceivePort,监视目录 C:\FileIn\*.xml
回到BizTalk 管理控制台,找到上一篇中建立的发送端口,注销,删除它。
建立新的发送端口。
新建静态单向发送端口。
配置新的发送端口,端口名:SendToDirector,端口类型 文件 File,发送目录 C:\FileOutDirector\
从左边选项卡选择 过滤器 Filters。填写订阅条件:
BTS.ReceivePortName == FileReceivePort And
ExpenseBTS.PropertySchema.Amount > 10000 And
点击确定完成此发送端口的设置。再次点击右键,新建发送端口。
设置名称 SendToOthers,类型 文件 File,发送目录 C:\FileOutOthers\
在左边选项卡中选择筛选器 Filters。
设置订阅条件:
BTS.ReceivePortName == FileReceivePort And
ExpenseBTS.PropertySchema.Amount <= 10000 And
再次确定。完成发送端口设置。
返回BizTalk管理控制台,完全开启Expense应用程序。
开启后,我们新建XML测试文件。输入如下文本:
<ns0:Root xmlns:ns0="http://ExpenseBTS.Expense">
<Amount>20000</Amount>
<Purpose>Purpose_0</Purpose>
</ns0:Root>
保存测试文件。
再建立另一XML测试文件。输入文本:
<ns0:Root xmlns:ns0="http://ExpenseBTS.Expense">
<Amount>5000</Amount>
<Purpose>Purpose_0</Purpose>
</ns0:Root>
开始测试,将两个测试文件都放入监视目录:C:\FileIn\
正确的测试结果是:
1. 两个文件放入后都消失(开始处理)
2. C:\FileOutDirector\目录中产生一个XML文件,Amount字段为20000.
3. C:\FileOutOthers\目录中产生一个文件,Amount字段为5000
OK,测试完成。
今天的实验就到这里。
明天,我们进一步拓展Expense应用程序。来看看,在使用基本数据订阅时,经常碰到的错误,及解决方法。
特殊说一句,以后的题目会逐渐深入,随着题目的逐渐深入,适合看文章的同事也逐渐要求对BizTalk Server有一定了解。
所以我在后面的文章里会适当减少截图。
以上。
欢迎大家讨论。完全原创,转帖请务必注明出处。