65.9K
CodeProject 正在变化。 阅读更多。
Home

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

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2011 年 12 月 1 日

CPOL

4分钟阅读

viewsIcon

28679

本文旨在解释如何根据消息内容动态选择 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' 表示。

UseCase.PNG

将 Itinerary 分配给传入消息有哪些不同方式?

将 Itinerary 分配给消息的 3 种不同方式是 “Advanced Service client”“Adaptive Service Client”“Service Proxy”。以下说明将进一步详细解释它们。

  1. 高级服务客户端:客户端在 WCF/SOAP header 请求本身中指定 Itinerary
  2. 自适应服务客户端:客户端通过解析器服务解析 Itinerary,然后将其作为 WCF/SOAP Header 请求发送。
  3. 服务代理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'。有关更多信息,请参阅参考文献部分中的链接。

Rules_2.PNG

理解 Itinerary

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

Itinerary.PNG
  1. ESB On-Ramp:ESB on-ramp 接收 Contact 消息。
  2. Orchestration ExtenderContact 消息由在 orchestration extender 中配置的 orchestration 消耗。
  3. Off-ramp extender:请注意使用了 BRE extender。请注意,这是 BRE 而不是 BRI(用于选择 Itinerary)。此处 BRE 用于设置出站属性。请参阅下面的下一节。
  4. ESB Off-Ramp:消息被路由到动态 BizTalk Server 发送端口,该端口也称为 ESB off-ramp。

理解 Itinerary 中的 BRE 解析器

BRE resolver 用于从 Business Rules Engine (BRE) 策略中检索 Outbound 传输属性。请观察截图中的设置。

ItineraryBREResolver.PNG

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 消息。请注意可激活接收形状所需的筛选器设置。

OrchestrationFilter.PNG

步骤 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();

OrchestrationAsService.PNG

hasNextService 标志用于确定是否应将消息发送回 ESB 总线以进行进一步的 Itinerary 处理。在我们的示例中,如果标志为 false,则不会将任何消息放入 ESB 总线。

步骤 3:提升出站消息的相关性属性

需要一个直接绑定到消息框的逻辑发送端口来发送 ESB 消息。请注意发送形状所需设置的 correlation 属性。

PropertiesToCorrelate.PNG

步骤 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 消息。

可下载代码

本文未提供代码,因为这留给开发人员作为练习。

进一步阅读的参考资料

© . All rights reserved.