使用 BizTalk 2010 和 Enterprise Service Bus Toolkit 2.1 进行行程动态消息处理和路由





0/5 (0投票)
本文旨在解释如何根据消息内容动态选择 BizTalk ESB 行程。
您是 BizTalk Enterprise Service Bus (ESB) 2.1 Toolkit 的新手吗?
请参阅我的“Hello ESB”文章,它将带您入门。
引言
在本文中,您将学习如何根据消息内容使用 BRI
来确定要附加到消息的 Itinerary
。在此,我们将查看消息内容并确定要为消息附加哪个 Itinerary。您还将学习如何编写符合 ESB
标准的 orchestration
来从 ESB
总线消耗消息。
问题陈述
您将如何通过动态查看 Contact
消息的内容来确定要附加哪个 Itinerary
?
CRM 联系人通过行程路由到 MS CRM 系统或 BlackBaud CRM 系统,具体取决于 ContactID
(这是消息本身的一部分)。Contact
用符号 'C'
表示,Itinerary
用符号 'I'
表示。

将 Itinerary 分配给传入消息有哪些不同方式?
将 Itinerary 分配给消息的 3 种不同方式是 “Advanced Service client”
、“Adaptive Service Client”
和 “Service Proxy”
。以下说明将进一步详细解释它们。
- 高级服务客户端:客户端在
WCF/SOAP header
请求本身中指定Itinerary
。 - 自适应服务客户端:客户端通过解析器服务解析
Itinerary
,然后将其作为WCF/SOAP Header
请求发送。 - 服务代理:
Itinerary
通过可配置的解析器在服务器的 ESB On-Ramp 接收端口上解析。
请注意,在本文中,我们使用的是 Service Proxy
方法。
联系人消息
联系人 XML 消息
<ns0:Contact xmlns:ns0="http://ContactCanonical.Contact">
<contactid>101</contactid>
<name>
<firstname>John</firstname>
<middlename>F</middlename>
<lastname>Doe</lastname>
</name>
<addresses>
<address type="home">
<street>707 Richmon Trl</street>
<city>Plano</city>
<state>TX</state>
<zip>75033</zip>
</address>
<address type="work">
<street>2232 N Walnut Ave</street>
<city>Dallas</city>
<state>TX</state>
<zip>75041</zip>
</address>
</addresses>
<phones>
<phone type="work">
<number>234-232-WORK</number>
</phone>
<phone type="home">
<number>435-434-HOME</number>
</phone>
</phones>
注意联系人 XML 消息中的 ContactID
。
确定要附加到联系人消息的 Itinerary
使用策略和一组规则来确定需要为 Contact
消息选择哪个 Itinerary
。
您将在接收位置的 ESB 接收管道中指定此 policy
。这将确定要用于 Contact
消息的 Itinerary
。
请注意,任何通过 ESB 的 XML 架构实例(XML 文档)的规则引擎上的 document type
都必须设置为 'Microsoft.Practices.ESB.ResolverProviderMessage'
。有关更多信息,请参阅参考文献部分中的链接。

理解 Itinerary
请注意,本示例中有两个 Itineraries
(每个 CRM 一个),但这里只描述了一个,因为它们几乎相似。

- ESB On-Ramp:ESB on-ramp 接收
Contact
消息。 - Orchestration Extender:
Contact
消息由在 orchestration extender 中配置的 orchestration 消耗。 - Off-ramp extender:请注意使用了
BRE extender
。请注意,这是BRE
而不是 BRI(用于选择 Itinerary)。此处 BRE 用于设置出站属性。请参阅下面的下一节。 - ESB Off-Ramp:消息被路由到动态 BizTalk Server 发送端口,该端口也称为 ESB off-ramp。
理解 Itinerary 中的 BRE 解析器
BRE resolver
用于从 Business Rules Engine (BRE) 策略中检索 Outbound
传输属性。请观察截图中的设置。

resolver
返回的数据包含 transport
属性。
<Resolver>
<name>Resolver.TransportLocation</name>
<value>C:\ESBSource\ContactSubscription\Output\MSCRM_%MessageID%.xml</value>
</resolver>
<resolver>
<name>Resolver.TransportNamespace</name>
<value>
</resolver>
<resolver>
<name>Resolver.TransportType</name>
<value>FILE</value>
</resolver>
开发 BizTalk ESB 兼容 Orchestration 的步骤
步骤 1:消息框绑定
需要一个直接绑定到消息框的逻辑接收端口来接收 ESB 消息。请注意可激活接收形状所需的筛选器设置。

步骤 2:编写 Orchestration 的核心代码
// Retrieve the current itinerary step.
itineraryWrapper = new Microsoft.Practices.ESB.Itinerary.SerializableItineraryWrapper();
itineraryStepWrapper = new Microsoft.Practices.ESB.
Itinerary.SerializableItineraryStepWrapper();
itineraryWrapper.Itinerary = Microsoft.Practices.ESB.
Itinerary.ItineraryOMFactory.Create(msgInbound);
itineraryStepWrapper.ItineraryStep =
itineraryWrapper.Itinerary.GetItineraryStep(msgInbound);
hasNextService = itineraryWrapper.Itinerary.HasNextService();
hasNextService
标志用于确定是否应将消息发送回 ESB 总线以进行进一步的 Itinerary
处理。在我们的示例中,如果标志为 false
,则不会将任何消息放入 ESB 总线。
步骤 3:提升出站消息的相关性属性
需要一个直接绑定到消息框的逻辑发送端口来发送 ESB 消息。请注意发送形状所需设置的 correlation
属性。

步骤 4:esb.config 条目
在 C:\Program Files (x86)\Microsoft BizTalk ESB Toolkit 2.1 下找到 esb.config,找到 XML 标签 itineraryServices
并添加以下内容
<itineraryService id="e2710ecc-1dcd-49e0-b6a0-fd318227d24c"
name="ContactOperation.ProcessMSCRMSubscription" stage="None"
scope="Orchestration" type="ContactOperation.ProcessMSCRMSubscription,
ContactOperation, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=2710b190689828fa" />
<itineraryService id="b506da17-126d-41b1-8bff-664a59e91570"
name="ContactOperation.ProcessBBAUDSubscription" stage="None"
scope="Orchestration" type="ContactOperation.ProcessBBAUDSubscription,
ContactOperation, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=2710b190689828fa" />
体会
使用 BRI
通过查看消息内容来解析和附加 Itinerary 到消息。在示例中,我们根据 ContactID
的值将 Itinerary
附加到了 Contact
消息。
可下载代码
本文未提供代码,因为这留给开发人员作为练习。