路线接入点示例工作原理
示例行程测试客户端应用程序生成一组 SOAP 标头,其中包含使用客户端应用程序窗口中的控件创建的行程,从磁盘加载指定的消息文件,将行程标头追加到消息中,并通过 Routey on-ramp 将其提交到 ESB 进行处理。 如果行程生成响应,应用程序会收集响应并将其显示在应用程序窗口中。
可以从多个示例行程配置文件中进行选择,以查看使用业务流程、消息传送或两者组合的单向和双向方案。
为了帮助你了解行程服务如何使用消息中的行程信息,以下 XML 显示了前面示例中使用的名为 TwoWay-OrchTransform-OrchRoutingGroup-OrchTwoWayCustom.xml 的示例行程配置文件。 此行程的第一部分指定三个服务调用步骤。
<Itinerary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" uuid="" beginTime="" completeTime="" state="Pending" isRequestResponse="false" servicecount="0" xmlns="http://schemas.microsoft.biztalk.practices.esb.com/itinerary">
<BizTalkSegment interchangeId="" epmRRCorrelationToken="" receiveInstanceId="" messageId="" xmlns="" />
<ServiceInstance name="Microsoft.Practices.ESB.Services.Transform" type="Orchestration" state="Pending" position="0" isRequestResponse="false" xmlns="" />
<Services xmlns="">
<Service uuid="92d3b293-e6d4-44a1-b27d-c42b48aec667" beginTime="" completeTime="" name="Microsoft.Practices.ESB.Services.Transform" type="Orchestration" state="Pending" isRequestResponse="false" position="0" serviceInstanceId="" />
</Services>
<Services xmlns="">
<Service uuid="774488bc-e5b9-4a4e-9ae7-d25cdf23fd1c" beginTime="" completeTime="" name="Microsoft.Practices.ESB.Services.Routing" type="Orchestration" state="Pending" isRequestResponse="false" position="1" serviceInstanceId="" />
</Services>
<Services xmlns="">
<Service uuid="" beginTime="" completeTime="" name="ProcessAndRespond" type="Orchestration" state="Pending" isRequestResponse="true" position="2" serviceInstanceId="" />
</Services>
...
在行程中的服务调用步骤列表之后,包含解析程序的详细信息, (由连接字符串) 表示,这些字符串允许行程服务查找或提供行程中定义的每项服务的解析信息。
...
<ResolverGroups xmlns="">
<Resolvers serviceId="Microsoft.Practices.ESB.Services.Transform0"><![CDATA[BRE:\\Policy=ResolveMap;Version=1.0;UseMsg=False;]]></Resolvers>
<Resolvers serviceId="Microsoft.Practices.ESB.Services.Routing1"><![CDATA[STATIC:\\TransportType=FILE;TransportLocation=C:\Projects\Microsoft.Practices.ESB\Source\Samples\DynamicResolution\Test\Filedrop\OUt\%MessageID%.xml;Action=;EndpointConfig=;JaxRpcResponse=False;MessageExchangePattern=;TargetNamespace=;TransformType=;]]><![CDATA[UDDI3:\\ServerUrl=http://localhost/uddi;SearchQualifiers=andAllKeys;CategorySearch=;BindingKey=uddi:esb:orderfileservicev3.1;]]></Resolvers>
<Resolvers serviceId="ProcessAndRespond2" />
</ResolverGroups>
</Itinerary>
注意
每个 <Resolvers> 元素的实际内容不包含用于包装前面列表中的行的空格字符。
下面是在前面的行程配置中定义的三个步骤:
执行 Microsoft.Practices.ESB.Services.Transform 业务流程,使用 BizTalk 业务规则引擎 (BRE) 使用 ResolverMap 策略转换消息。
执行 Microsoft.Practices.ESB.Services.Routing 业务流程,使用路由 Microsoft.Practices.ESB.Services.Routing1 将转换后的消息路由到多个位置。 ResolverGroups<> 部分包含具有<此标识符的 Resolvers> 元素,用于定义连接字符串。
执行随此示例一起提供的 ProcessAndRespond 业务流程。 此业务流程的实现将请求消息的副本作为响应发送回行程测试客户端。
完成每项服务后,该服务会提前行程,并将行程中定义的下一个服务提升为当前服务实例,其状态设置为 “挂起”。
注意
行程 On-Ramp 示例使用动态分辨率将消息发送到输出文件夹。 这就是没有为此示例定义静态发送端口的原因。
下面是在测试客户端应用程序提交消息后发生的事件序列:
OnRamp.行程接收端口接收消息。
ItineraryReceiveXml 管道从 SOAP 标头中提取行程,对其进行验证和预处理,将行程作为消息上下文属性写入入站消息,并将消息发布到 BizTalk Message Box 数据库。
Microsoft.Practices.ESB.Services.Transform 服务业务流程的订阅会触发对此业务流程的调用。 业务流程首先通过将当前消息作为参数传递来检索当前行程步骤,如以下代码所示。
itineraryStep = itinerary.Itinerary.GetItineraryStep(InboundMessage);
ItineraryStep 对象包含有关当前要执行的服务实例以及与之关联的任何解析程序的所有信息。
Resolver 对象从 ItineraryStep 实例中检索,ESB 解析程序框架用于解析转换映射的全名,如以下代码所示。
resolverDictionary = Microsoft.Practices.ESB.Resolver.ResolverMgr.Resolve(InboundMessage, resolver); // Set the transform type. transformType = resolverDictionary.Item("Resolver.TransformType");
Microsoft BizTalk ESB 工具包解析程序和适配器框架通过从缓存 (加载适当的冲突解决程序来实现此目的,在此示例中,BizTalk 业务规则引擎解析程序) ,该解析程序调用 ResolverMap 策略并填充 ResolverDictionary 对象。
业务流程完成后,代码将调用 AdvanceItinerary 方法,如以下代码所示。
// Call the Itinerary helper to advance to the next step. itinerary.Itinerary.Advance(OutboundMessage, itineraryStep.ItineraryStep);
这会通过更新其属性并提升行程中定义的下一个服务作为下一个要执行的服务来推进当前行程。 方法将行程复制到出站消息中,服务通过直接绑定发送端口将其发布回 Message Box 数据库。
Microsoft.Practices.ESB.Services.Delivery 服务业务流程的订阅会触发此业务流程的调用。 此业务流程遵循与第一个业务流程类似的过程,获取当前行程步骤。 但是,此业务流程会循环访问 由 ItineraryStep 实例返回的解析程序集合。 对于集合中的每个解析程序,传递业务流程使用 Microsoft BizTalk ESB 工具包解析程序和适配器框架解析传输位置,并将其提升为传出消息中的上下文属性,如以下代码所示。
// Move to retrieve the first resolver. resolver = resolvers.Current; // Pass the resolver configuration to the Resolver Manager // for resolution. resolverDictionary = Microsoft.Practices.ESB.Resolver.ResolverMgr.Resolve(InboundMessage, resolver); // Set the transport properties. transportLocation = resolverDictionary.Item("Resolver.TransportLocation"); transportType = resolverDictionary.Item("Resolver.TransportType"); // Call the Adapter Manager to set all necessary properties. Microsoft.Practices.ESB.Adapter.AdapterMgr.SetEndpoint( resolverDictionary, DeliveryMessage); // Set the delivery port address and type. DeliveryPort(Microsoft.XLANGs.BaseTypes.Address) = transportLocation; DeliveryPort(Microsoft.XLANGs.BaseTypes.TransportType) = transportType;
ProcessAndRespond 业务流程的订阅会触发此业务流程的调用,因为为筛选器表达式属性定义的消息上下文属性匹配。
(Microsoft.Practices.ESB.Itinerary.Schemas.ServiceName == :"ProcessAndRespond") && Microsoft.Practices.ESB.Itinerary.Schemas.ServiceState == "Pending") && (Microsoft.Practices.ESB.Itinerary.Schemas.ServiceType == "Orchestration")
ProcessAndRespond 业务流程推进行程,并将原始请求消息发送回坡道服务,作为响应的行程测试客户端应用程序。