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

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

Насколько я вижу, мой приемный конвейер в точности похож на ItinerarySelectReceiveXml, за исключением компонента конвейера ESB Itinerary Select (на этапе ResolveParty). Я жестко закодировал строку подключения и ItineraryFactName (например, BRI:\policy=MyResolveItineraryRule;useMsg=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. шаг, контекст IPipelineContext, сообщение IBaseMessage msg) в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.<>c__DisplayClassa.b__8() в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.AdvanceByOrirection, MessageMine Строка serviceInstanceId, шаг IItineraryStep, действие submitToBam, Boolean advanceStep) в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.Advance(сообщение IBaseMessage, контекст IPipelineContext, шаг IItineraryStep, логический файл advanceStep.Sec. OM.V1.ItineraryV1.Advance (сообщение IBaseMessage, контекст IPipelineContext, шаг IItineraryStep) в Microsoft.Practices.ESB.PipelineComponents.Dispatcher.Execute(контекст IPipelineContext, IBaseMessage сбщ)

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

ps Я также разместил этот вопрос в форме ESB Toolkit здесь 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(*)

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

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

Другие вопросы по тегам