Как разрешить службу трансформации с BRE, которая происходит после оркестровки в маршруте?

Пытаясь реализовать простые шаблоны интеграции с помощью Biztalk ESB Toolkit 2.0, я сталкиваюсь с проблемой, пытаясь разрешить службу маршрута преобразования, которая возникает после оркестровки.

Я использую Resolver BRE для выполнения правил, которые должны проверять свойство Context Message Type, чтобы определить подходящую карту для использования. Однако, как только сообщение достигает шага в Маршруте, связанном со Службой преобразования, карта не выполняется.

Из тщательного изучения выясняется, что тип сообщения не передается объекту "Resolution", который используется внутренним средством для разрешения BRE. Действительно, поскольку сообщение, покидающее предыдущую оркестровку, набрано System.Xml.XmlDocumentтип сообщения "понижен в должности" из контекста.

Отслеживая выполнение механизма правил, я могу наблюдать, что тип сообщения действительно теряется при достижении решателя BRE. Тип сообщения является пустым, в то время как строго типизированный документ Microsoft.XLANGs.BaseTypes.Any,

Сервис Orchestration, который я использую, взят из примеров, поставляемых с ESB Toolkit 2.0.

Есть ли способ выполнить разрешение BRE на основе контекста после оркестровки в маршруте?

1 ответ

Решение

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

Оркестровое Маршрутное Обслуживание 101

Изо всех сил пытаясь заставить это работать и пробуя различные решения, я наконец преуспел с набором простых правил, которым нужно следовать. В этой статье я хотел бы обрисовать, что представляет собой хорошо организованную оркестровку ESB Toolkit 2.0, которая может использоваться в качестве службы маршрутов и при этом использовать механизм разрешения бизнес-правил для динамического преобразования, основанного на типе контекста сообщения.,

Контекстная подписка на маршрутную услугу

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

Microsoft.Practices.ESB.Itinerary.Schemas.ServiceName == "MyCustomItineraryService" And
Microsoft.Practices.ESB.Itinerary.Schemas.ServiceState == "Pending" And
Microsoft.Practices.ESB.Itinerary.Schemas.ServiceType == "Orchestration"

Документация не упоминает об этом, но это проясняет, что операции порта с прямой связью должны быть сопоставлены с сообщениями типа System.Xml.XmlDocument. Действительно, если это не так, оркестровка не будет выполнена, и сообщение об ошибке маршрутизации будет зарегистрировано в окне сообщений.

Кстати, это означает, что сам тип сообщения вообще не входит в учетную запись. И это во многом объясняет, почему после выполнения оркестровки распознаватель Business Rules Engine не может определить правильное преобразование.

Получение на маршруте

Следующий код в форме выражения в начале оркестровки помогает получить текущий шаг маршрута:

// Retrieve the current itinerary step.
itinerary.Itinerary = Microsoft.Practices.ESB.Itinerary.ItineraryOMFactory.Create(InboundMessage);
itineraryStep.ItineraryStep = itinerary.Itinerary.GetItineraryStep(InboundMessage);

Сохранение контекста исходного сообщения

Далее, контекст исходного сообщения должен быть сохранен (по большей части) на каждом этапе оркестровки. Это особенно важно при наличии нескольких промежуточных конструктивных форм в оркестрации для выполнения конкретного сценария под рукой.

OutboundMessage(*) = SourceMessage(*)

Обратите внимание, что я написал "по большей части" в предложении выше. Фактически, как мы увидим через минуту, тип получающегося сообщения должен присутствовать в контексте в конце оркестровки. Скорее всего, это будет другой тип, чем исходное входящее сообщение. А так как присвоение доступному только для чтения свойству BTS.MessageType невозможно, иногда это может быть довольно сложно достичь.

Возможно, вам придется прибегнуть к выполнению пользовательского конвейера внутри оркестровки или другим экзотическим методам, чтобы это имело место. Однако в большинстве случаев приведенный выше синтаксис должен работать.

Продвижение маршрута

Следующий очень простой код не должен быть забыт в конце оркестровки:

itinerary.Itinerary.Advance(OutboundMessage, itineraryStep.ItineraryStep);

Продвижение свойств контекста

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

Содействие свойствам

Однако в сценарии, изложенном в этом посте, этого явно недостаточно.

Чтобы контекстно-зависимые правила работали после оркестровки, необходимо также повысить свойство BTS.MessageType. Это может быть легко достигнуто путем инициализации корреляции формы отправки в конце оркестровки.

Корреляция типа сообщений

И это работает!

Повышение типа сообщения в контексте полученного сообщения было тем, чего не хватало в моей первоначальной попытке. Как только это было идентифицировано, маршрут работал как очарование!

Журнал обстрела правил

Хотя решение может показаться очевидным после факта, оно наверняка помогло бы мне, если бы я знал это раньше. Я надеюсь, что этот пост поможет тем, кто сталкивается с той же проблемой.

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