Модель сообщений и объектов Exchange в ESB
Ключевым объектом передачи и трансформации данных по сконфигурированному маршруту является объект Exchange. Объект Exchange – это контейнер сообщения, который создается при запуске потока, проходит по сконфигурированному в редакторе потоков маршруту и удаляется по завершении работы потока.
В этот объект передаются и в нем трансформируются данные в процессе работы потока; в каждом блоке потока в объекте Exchange сохраняются состояния объекта Before и After – перед отработкой функциональности блока и после нее, соответственно
Поток, создаваемый в редакторе, – это, по сути, инструкция программному ядру на обработку иницированного сообщения. Объект Exchange проходит по заданному маршруту в соответствии с этой инструкцией.
При запуске потока создается пустой объект Exchange и наполняется данными, пришедшими в запросе.
Exchange объект состоит из следующих значимых компонентов, с которыими ведется работа в потоке:
-
Заголовки (Headers) – содержит данные заголовков, которые были получены в запросе как часть заголовков или параметров запроса (Query parameters).
-
Тело (Body) – содержит полезную нагрузку сообщения.
-
Свойства (Properties) – содержит свойства Exchange, технические контекстные данные, объявленные переменные и параметры пути (Path parameters) из запроса.
В процессе составления потока из последовательности блоков, пользователь сам решает в зависимости от системных и бизнес требований конфигурируемого потока, какие данные нужно передать в Header, Body или Property. Для этого пользователь может пользоваться блоками Set Header, Set Headers, Set Body, Set Property, Set Properties и другими.
Пример создания и маршрута объекта Exchange
Рассмотрим простой пример создания и передачи объекта Exchange. Создадим простой поток из трех блоков – HTTP Trigger, Set Body и Http Sender.
Сначала мы сообщаем ядру как мы принимаем этот запрос (в нашем примере добавляем блок HTTP-Trigger), далее сообщаем что с этим запросом делать (в примере добавляем блок Set Body – определить Body), потом куда его отправить (выполняется блоком HTTP Sender). После завершения маршрута на выходе получается тот же объект Exchange, но после обработки интеграционными блоками. Таким образом, создается инструкция на стороне программного ядра. После того как маршрут завершен, финальное состояние объекта Exchange возвращается инициатору в рамках синхронного ответа и стирается.

Пример простого потока
В данном потоке выполняются следующие шаги:
-
Сообщение приходит в блок HTTP Trigger.
-
Создается объект Exchange и наполняется данными, пришедшими в запросе – Body, Headers. Properties берутся из параметров запроса (Path parameters).
-
Далее объект Exchange отправляется по маршруту и попадает в следующий блок – Set Body. На этом шаге в соответствии с функциональностью блока заменяется тело объекта – Body. Headers и Properties не изменяются.
-
Далее объект Exchange отправляется по маршруту в блок HTTP Sender, который отправляет его по заданному адресу с теми же заголовками и свойствами, что и исходный объект, но с измененным Body. В том случае, если блок ожидает ответ от заданной конечной точки, по получении ответа в объекте Exchange могут быть модифицированы все составляющие – Headers, Body, Properties.
Exchange объект хранит в себе на каждом шаге два состояния – До (Before) и После (After).
В приведенном примере на первом шаге состояние Before – это пустой объект, а состояние After – это объект с записанными вы него пришедшими из запроса данными. После получения и обработки объекта Exchange следующим блоком Set Body, состояние After пришедшего с первого шага объекта стало состоянием Before на втором шаге. Состояние After на втором шаге – это объект с измененным Body. Эти состояния важны для логирования процесса, поскольку позволяют отследить изменения объекта при обработке каждым блоком.
Изменения состояний Exchange объекта при работе с блоком Set Body проиллюстрированы на рисунке ниже.

На каждом шаге Exchange объект сохраняет два состояния
После завершения прохождения по маршруту объект Exchange стирается.
Если маршрут включает блоки управления, такие как Parallel,Loop и другие, то может происходить копирование объекта Exchange в несколько таких же объектов, которые проходят по разным веткам маршрута, но на выходе эти объекты всегда собираются в один объект Exchange. Описание работы Exchange Object для некоторый специфичных блоков представлено в следующих разделах.
Поведение Exchange объекта при прохождении блока Parallel
Блок Parallel работает с объектом Exchange следующим образом: создаются копии объекта Exchange в состоянии After предыдущего блока, которые обрабатываются параллельно разными ветками и на выходе снова собираются в один объект. Для того чтобы собрать из частей один объект, на блоке Parallel есть атрибут Aggregation Strategy (выбор из списка), который задает правила, по которым будет собираться конечный Exchange объект.
Поведение Exchange объекта при прохождении блока Loop
Если маршрут включает в себя блок Loop, то объект Exchange проходит по нему согласно заданной в Expression логике, каждый раз перетирая предыдущие состояния.
По завершении работы блока Loop объект Exchange будет содержать состояния последней итерации.