2009-12-01 81 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