0

我正在尝试通过调用接收管道(类似于提供的 ItinerarySelectReceiveXml 接收端口)从编排内部执行动态行程路由,以解析给定消息的行程并将其发送到直接绑定端口以进行 ESB 路由。该设置类似于 ComposedMessageProcessor BizTalk 示例。

据我所知,我的接收管道与 ItinerarySelectReceiveXml 完全一样,除了在 ESB 行程选择管道组件(在 ResolveParty 阶段)我已经硬编码了连接字符串和 ItineraryFactName(例如 BRI:\policy=MyResolveItineraryRule;useMsg=true ;recognizeMessageFormat=true; 和 Resolver.Itinerary),这样我就不必使用环回适配器进行技巧和招致额外的消息框访问。

从表达式形状调用接收管道的代码如下:

// 我要路由的第一条消息只是传入消息上的一个节点

strXPath = "/*[local-name()='BeginConversationMessage' and namespace-uri()='http://MyCompany.BeginConversationMessage.v001']/*[local-name()='BeginConversationMessage' and namespace-uri()='http://MyCompany.BeginConversationMessage.v001']";
BeginConversationMessage = xpath(InboundMsg, strXPath);
RcvPipeOutput = Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteReceivePipeline(typeof(MyCompany.Itinerary_GenericSelector), BeginConversationMessage);

这很顺利,我可以看到正在使用 SQL Profiler 解析消息类型的正确行程,并且我知道行程很好,因为我将它用于具有通用行程入口的此消息类型。

但是我在 Microsoft.Practices.ESB.Itinerary.PipelineComponents.ItinerarySelector 之后得到了 Microsoft.Practices.ESB.PipelineComponents.Dispatcher 的异常(在解决方阶段)

文档声明 ESB 行程选择器管道组件应使用以下属性设置行程的 Microsoft BizTalk Server 段:correlationToken、reqRespTransmitPipelineID、interchangeId、receiveInstanceId、epmRRCorrelationToken。

异常如下所示:

值不能为空。参数名称:interchangeId

来源:Microsoft.Practices.ESB.PipelineComponents.Dispatcher

方法:Microsoft.BizTalk.Message.Interop.IBaseMessage 执行(Microsoft.BizTalk.Component.Interop.IPipelineContext, Microsoft.BizTalk.Message.Interop.IBaseMessage)

错误来源:Microsoft.Practices.ESB.Itinerary.OM.V1

错误目标站点:System.Object[] GetItineraryDataForBAM(Microsoft.Practices.ESB.Itinerary.OM.V1.Itinerary,Microsoft.Practices.ESB.Itinerary.IItineraryStep,System.String)

错误 StackTrace:在 Microsoft.Practices.ESB.Itinerary.OM.V1.BAMItineraryProcess.SubmitToBAM(Itinerary itinerary, IItineraryStep步骤,IPipelineContext 上下文,IBaseMessage msg) 在 Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.<>c__DisplayClassa.b__8() 在 Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.AdvanceByOrder(ItineraryMessageDirection messageDirection, Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.Advance 中的字符串 serviceInstanceId、IItineraryStep 步骤、Action submitToBam、Boolean advanceStep)(IBaseMessage 消息、IPipelineContext 上下文、IItineraryStep 步骤、Boolean advanceStep)在 Microsoft.Practices.ESB.Itinerary。 OM.V1.行程V1。在 Microsoft.Practices.ESB.PipelineComponents.Dispatcher.Execute(IPipelineContext 上下文,IBaseMessage 消息)的高级(IBaseMessage 消息,IPipelineContext 上下文,IItineraryStep 步骤)

任何帮助,将不胜感激。

ps 我也已在此处将这个问题发布到 ESB 工具包表单http://social.msdn.microsoft.com/Forums/en/biztalkesb/thread/28c5befe-4c7f-4dc1-a5e7-8fe5b3ec1c75

4

1 回答 1

1

首先,我认为关键是保留原始消息的上下文。从管道接收消息时,您需要在构造形状中使用以下语法,以恢复上下文:

PipelineMessage = null;

RcvPipeOutput = Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteReceivePipeline(
    typeof(MyCompany.Itinerary_GenericSelector), BeginConversationMessage);

RcvPipeOutput.MoveNext();
RcvPipeOutput.GetCurrent(PipelineMessage);
PipelineMessage(*) = BeginConversationMessage(*)

事实上,消息的上下文需要在编排中的中间消息构造期间始终保留。此外,在离开编排之前提升正确的上下文属性也很重要。

这可以通过初始化编排中最后一个发送形状的相关性来完成。确保相关性包括正确的属性,包括错误消息中提到的属性。

于 2010-06-15T17:53:52.680 回答