如何使用在行程中的业务流程之后发生的BRE来解决转换服务?

时间:2010-06-08 16:10:35

标签: biztalk biztalk-2009 esb-toolkit-2.0

在尝试使用Biztalk ESB Toolkit 2.0实现简单集成模式时,我在尝试解决业务流程后发生的转换行程服务时遇到了问题。

我正在使用BRE Resolver执行需要检查Context Message Type属性的规则,以确定要使用的相应映射。但是,一旦消息到达与转换服务关联的行程中的步骤,映射就无法执行。

通过仔细调查,似乎消息类型未提供给BRE解析器内部使用的“Resolution”对象。实际上,由于留下前一个Orchestration的消息是键入的System.Xml.XmlDocument,因此消息的类型将从上下文中“降级”。

通过跟踪规则引擎执行,我可以在到达BRE解析器时观察到消息的类型确实丢失。消息的类型为空,而文档的强类型为Microsoft.XLANGs.BaseTypes.Any

我使用的Orchestration服务直接来自ESB Toolkit 2.0附带的示例。

是否有办法在行程中的业务流程后执行基于上下文的BRE解析

1 个答案:

答案 0 :(得分:0)

回答我自己的问题......简而言之,关键是要预先处理原始消息的上下文并提升MessageType上下文属性。在以下段落中,我将在my blog上重现即将发布的帖子:

业务流程行程服务101

在努力完成这项工作并尝试不同的解决方案后,我终于成功完成了一系列简单的规则。在这篇文章中,我想概述什么构成了一个行为良好的ESB Toolkit 2.0友好编排,可以用作行程服务,并仍然利用业务规则引擎解析器根据消息的上下文类型进行动态转换

行程服务的上下文订阅

首先,设计用作行程服务的业务流程需要有一个直接绑定的逻辑端口,链接到定义ESB友好订阅的接收形状,如下所示:

Microsoft.Practices.ESB.Itinerary.Schemas.ServiceName == "MyCustomItineraryService" And
Microsoft.Practices.ESB.Itinerary.Schemas.ServiceState == "Pending" And
Microsoft.Practices.ESB.Itinerary.Schemas.ServiceType == "Orchestration"

文档没有提到这一点,但是这清楚地表明需要将直接绑定端口操作映射到System.Xml.XmlDocument类型的消息。实际上,如果不是这种情况,业务流程将无法执行,并且路由失败错误消息将注册到消息框

顺便说一句,这意味着消息的类型根本不会被考虑在内。这很大程度上解释了为什么在执行业务流程之后,业务规则引擎解析器无法确定正确的转换。

进入行程

业务流程开头的表达式形状中的以下代码有助于检索当前的行程步骤:

// Retrieve the current itinerary step.
itinerary.Itinerary = Microsoft.Practices.ESB.Itinerary.ItineraryOMFactory.Create(InboundMessage);
itineraryStep.ItineraryStep = itinerary.Itinerary.GetItineraryStep(InboundMessage);

保留原始讯息的背景

接下来,必须在业务流程的每个步骤保留原始消息的上下文(大多数情况下)。当在业务流程中具有多个中间构造形状以执行特定方案时,这尤其重要。

OutboundMessage(*) = SourceMessage(*)

请注意,我在上面的句子中写了“大部分内容”。事实上,正如我们将在一分钟内看到的那样,生成的消息的类型需要在业务流程结束时的上下文中出现。最有可能的是,这将是不同类型而不是原始入站消息。由于无法分配给只读BTS.MessageType属性,有时可能会非常棘手。

您可能不得不求助于在业务流程或其他特殊技术中执行自定义管道。但是,大多数情况下,上面显示的语法都应该有效。

推进行程

在业务流程结束时,不能忘记以下非常直接的代码:

itinerary.Itinerary.Advance(OutboundMessage, itineraryStep.ItineraryStep);

宣传上下文属性

documentation并没有明确指出必须遵循的确切步骤,或者即使需要从这样的编排中提升属性,但是查看作为源代码提供的示例,可以发现以下属性参与解决机制:

Promoting Properties http://public.blu.livefilestore.com/y1pLURN1zH2vdRuLcF5yyAiHZQQ9rkdlrqG-QH01Nn8hEY5zH1W9TjjtNc0Z9421eFC2gUVG-srs2-NdcliI3XD1w/orchestration_service_promoting_properties.png?psid=1

但是,在本文中概述的情景中,这绝对是不够的。

要在业务流程之后工作的基于上下文的规则,还需要提升BTS.MessageType属性。这可以通过在业务流程结束时初始化发送形状的相关性来轻松实现。

Message Type Correlation http://public.blu.livefilestore.com/y1pQb-dkmbNBcur7CwdyudiIE9EMKGnZ0LoGuFpfDLseAWsiUz9C1EC1ZR5pn0gI4tgr3syEN2y-cfPB9EgEzlgtA/message_type_correlation.png?psid=1

它有效!

在生成的消息的上下文中提升消息类型是我原始尝试中缺少的内容。一旦确定了这一点,行程就像一个魅力!

Rule Firing Log http://public.blu.livefilestore.com/y1pGVViJM7SFbopcnYODHkqGUbkgS1RQR8a7ASVsNVDu8Krdhb_Vyj4PugbMPSFcfMEZ1P_3a7It0QQpXdF_dnvDg/rule_firing_log.png?psid=1

即使解决方案事后似乎显而易见,如果我早些时候知道这一点,肯定会帮助我。我希望这篇文章能帮助那些遇到同样问题的人。