BizTalk ESB Toolkit Динамическая маршрутизация из оркестрации

Я пытаюсь выполнить динамическую маршрутизацию маршрута из оркестровки, вызывая конвейер приема, очень похожий на предоставленный порт ItinerarySelectReceiveXml, чтобы разрешить маршрут для данного сообщения и отправить его на прямой связанный порт для маршрутизации ESB. Настройка аналогична образцу ComposedMessageProcessor BizTalk.

Мой конвейер приема точно такой же, как ItinerarySelectReceiveXml, насколько я могу судить, за исключением компонента конвейера ESB Itinerary Select (на этапе ResolveParty). Я жестко запрограммировал строку подключения и ItineraryFactName (например, BRI: \ policy = MyResolveItineraryRule; useMsg = true ; acceptMessageFormat = 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.PipelineComponents.Dispatcher, которое у меня есть сразу после Microsoft.Practices.ESB.Itinerary.PipelineComponents.ItinerarySelector (на этапе разрешения)

В документации указано, что компонент конвейера выбора маршрута ESB должен установить сегмент Microsoft BizTalk Server маршрута, используя следующие свойства: 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

Ошибка TargetSite: 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.GetItineraryDataForBAM (Маршрут маршрута, шаг IItineraryStep, String interchangeId) в Microsoft.Practices.ESB.Itinerary.OM.V1.BAMItineraryTineraryProcess. step, контекст IPipelineContext, сообщение IBaseMessage) в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1. ‹> c__DisplayClassa.b__8 () в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.AdvanceByOressage (ItineraryV1.AdvanceByOressage, ItineraryMessage String serviceInstanceId, IItineraryStep step, Action submitToBam, Boolean advanceStep) в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.Advance (сообщение IBaseMessage, контекст IPipelineContext, шаг IItineraryStep, логическое advanceStepices.ES) в Microsoft.Practices. OM.V1.ItineraryV1.Advance (сообщение IBaseMessage, контекст IPipelineContext, шаг IItineraryStep) в Microsoft.Practices.ESB.PipelineComponents.Dispatcher.Execute (IPipelineContext контекст, сообщение IBaseMessage)

Любая помощь будет оценена.

p.s. Я также разместил этот вопрос в форме ESB Toolkit здесь http://social.msdn.microsoft.com/Forums/en/biztalkesb/thread/28c5befe-4c7f-4dc1-a5e7-8fe5b3ec1c75


person Matthew    schedule 01.12.2009    source источник


Ответы (1)


Во-первых, я думаю, что главное - сохранить контекст исходного сообщения. При получении сообщения из конвейера вам необходимо использовать следующий синтаксис в форме конструкции, чтобы восстановить контекст:

PipelineMessage = null;

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

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

Фактически, контекст сообщение необходимо постоянно сохранять во время создания промежуточного сообщения в оркестровке. Кроме того, важно продвигать правильные свойства контекста, прежде чем покинуть оркестровку.

Это можно сделать, инициализировав корреляцию для последней формы отправки в оркестровке. Убедитесь, что корреляция включает правильные свойства, включая те, которые указаны в сообщении об ошибке.

person Maxime Labelle    schedule 15.06.2010
comment
Спасибо за ваш ответ. Я пока не использую BizTalk и ESB, поэтому не могу протестировать ваше решение, но спасибо за ответ. - person Matthew; 08.07.2010