我试图从编排中执行动态行程路由,方法是调用接收管道,很像提供的ESB端口,来解析给定消息的行程,并将其发送到ItinerarySelectReceiveXml路由的直接绑定端口。该设置类似于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的异常
文档指出,企业服务总线行程选择器管道组件应该使用以下属性设置行程的MicrosoftESBServer段: correlationToken、reqRespTransmitPipelineID、interchangeId、receiveInstanceId、epmRRCorrelationToken。
异常如下所示:
值不能为空。参数名称: interchangeId
来源: Microsoft.Practices.ESB.PipelineComponents.Dispatcher
方法: Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(Microsoft.BizTalk.Component.Interop.IPipelineContext,Microsoft.BizTalk.Message.Interop.IBaseMessage)
错误来源: Microsoft.Practices.ESB.Itinerary.OM.V1
Error TargetSite: System.Object[] GetItineraryDataForBAM(Microsoft.Practices.ESB.Itinerary.OM.V1.Itinerary,Microsoft.Practices.ESB.Itinerary.IItineraryStep,TargetSite)
错误消息: at Microsoft.Practices.ESB.Itinerary.OM.V1.BAMItineraryProcess.GetItineraryDataForBAM(Itinerary StackTrace,IItineraryStep step,String interchangeId) at Microsoft.Practices.ESB.Itinerary.OM.V1.BAMItineraryProcess.SubmitToBAM(Itinerary itinerary,interchangeId),IItineraryStep step,IPipelineContext context,IBaseMessage msg) at Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.AdvanceByOrder(ItineraryMessageDirection StackTrace,String messageDirection,IItineraryStep step,IBaseMessage submitToBam,在Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.Advance(IBaseMessage消息处的布尔advanceStep)、IPipelineContext上下文、IItineraryStep步骤、在Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.Advance(IBaseMessage消息处的布尔advanceStep)、IPipelineContext上下文、IItineraryStep步骤)在Microsoft.Practices.ESB.PipelineComponents.Dispatcher.Execute(IPipelineContext上下文处、IBaseMessage消息
任何帮助都将不胜感激。
附注:我还将这个问题发布到了ESB Toolkit Form here http://social.msdn.microsoft.com/Forums/en/biztalkesb/thread/28c5befe-4c7f-4dc1-a5e7-8fe5b3ec1c75中
发布于 2010-06-16 01:53:53
首先,我认为关键是保留原始消息的上下文。从管道接收消息时,您需要在构造形状中使用以下语法,以便恢复上下文:
PipelineMessage = null;
RcvPipeOutput = Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteReceivePipeline(
typeof(MyCompany.Itinerary_GenericSelector), BeginConversationMessage);
RcvPipeOutput.MoveNext();
RcvPipeOutput.GetCurrent(PipelineMessage);
PipelineMessage(*) = BeginConversationMessage(*)事实上,在编排中间消息构造过程中的context of the message needs to be preserved at all times。此外,在离开编排之前提升正确的上下文属性也很重要。
这可以通过初始化编排中最后一个发送形状的关联来完成。确保关联包括正确的属性,包括错误消息中提到的属性。
https://stackoverflow.com/questions/1826206
复制相似问题