BizTalk ESB Toolkit Динамическая маршрутизация изнутри оркестровки - PullRequest
0 голосов
/ 01 декабря 2009

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

Насколько я вижу, мой приемный конвейер в точности похож на ItinerarySelectReceiveXml, за исключением компонента конвейера ESB Itinerary Select (на этапе ResolveParty). Я жестко закодировал строку подключения и ItineraryFactName (например, BRI: \ policy = MyResolveItineraryRule; useMsg = true; признатьMessageFormat = 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.BAMItineraryProcess.SubmitToBAM (Маршрутный маршрут, шаг IItineraryStep, контекст IPipelineContext, сообщение IBaseMessage) в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1. <> c__DisplayClassa.b__8 () в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.AdvanceByOrder (ItineraryMessageDirection messageDirection, String serviceInstanceId, IItineraryStep, действие submitToBam, Boolean advanceStep) в 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)

Буду признателен за любую помощь.

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

1 Ответ

1 голос
/ 15 июня 2010

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

PipelineMessage = null;

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

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

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

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

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