2009-12-01 48 views
0

我试图通过调用一个接收管道,就像提供的ItinerarySelectReceiveXml受众端口一样,从一个编排内执行动态行程路由,以解析给定消息的行程并将其发送到一个用于ESB路由的直接绑定端口。该设置与ComposedMessageProcessor BizTalk示例类似。我的接收管道就像ItinerarySelectReceiveXml一样,除了ESB Itinerary Select管道组件(在ResolveParty阶段),我已经硬编码了连接字符串和ItineraryFactName(例如BRI:\ policy = MyResolveItineraryRule ; useMsg = true; recognisedMessageFormat = true;和Resolver.Itinerary),这样我就不必使用回送适配器来做技巧并且会产生额外的消息框访问。BizTalk ESB Toolkit动态路由从编排内

调用从表达式形状的接收管道的代码是这样的:

//第一个消息,我想航线只是在我的传入消息的节点

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事件探查器来解析,而且我知道行程是好的,因为我将它用于具有通用行程入口的此消息类型。

但是我却越来越偏离我的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

错误TargetSite:System.Object的[] GetItineraryDataForBAM(Microsoft.Practices.ESB.Itinerary.OM.V1 。行程,Microsoft.Practices.ESB.Itinerary.IItineraryStep,System.Stri NG)

错误堆栈跟踪:在Microsoft.Practices.ESB.Itinerary.OM.V1.BAMItineraryProcess.GetItineraryDataForBAM(行程的行程,IItineraryStep步骤,字符串interchangeId) 在Microsoft.Practices.ESB.Itinerary.OM.V1.BAMItineraryProcess .SubmitToBAM(行程路线,IItineraryStep步骤,IPipeline上下文,IBaseMessage味精) 在Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1。 <> c__DisplayClassa.b__8() at Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.AdvanceByOrder(ItineraryMessageDirection messageDirection,String serviceInstanceId,IItineraryStep step,Action submitToBam,Boolean advanceStep) at Microsoft.Practices.ESB.Itinerary。 OM.V1.ItineraryV1.Advance(IBaseMessage消息,IPipelineContext上下文,IItineraryStep步骤,布尔advanceStep) 在Microsoft.Practices.ESB。Itinerary.OM.V1.ItineraryV1.Advance(IBaseMessage消息,IPipelineContext上下文,IItineraryStep步骤) 在Microsoft.Practices.ESB.PipelineComponents.Dispatcher.Execute(IPipelineContext上下文,IBaseMessage MSG)

任何帮助,将不胜感激。

p.s.我也发布了这个问题到这里的ESB工具包表格http://social.msdn.microsoft.com/Forums/en/biztalkesb/thread/28c5befe-4c7f-4dc1-a5e7-8fe5b3ec1c75

回答

1

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

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在编排中间消息敷设渠道中。另外,在离开编排之前提升正确的上下文属性非常重要。

这可以通过初始化业务流程中最后一个发送形状的相关性来完成。确保关联包含正确的属性,包括错误信息中提到的属性。

+0

感谢您的回复。我的平均时间不是BizTalk和ESB,所以我无法测试你的解决方案,但是谢谢你的回应。 – Matthew