Статьи

Шаблоны обмена сообщениями Fluff Spring Integration

В этом посте будут обобщены только ключевые моменты шаблонов обмена сообщениями Spring Integration (SI).

У каждой точки будет реальный пример, основанный на моем опыте.

Splitter:

а. Что оно делает

Splitter — это шаблон, который получает одно сообщение в одной точке и разбивает его на несколько.

б. Почему это хорошо для меня?

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

с. Пример из реальной жизни

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

С Splitter вы можете делать все эти вещи одновременно.

д. Пример СИ:

<int:splitter id="tradeSplitter" input-channel="tradeSplitterInputChannel" output-channel="outPutChannel">

маршрутизатор:

а. Что оно делает

Маршрутизатор — это механизм, который отправляет сообщение в конкретное место назначения в зависимости от того, соответствует ли полученный контент определенным критериям.

б. Почему это хорошо для меня?

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

с. Пример из реальной жизни

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

д. Пример SI:

router id="notificationsRouter" input-channel="notificationInputChannel"

Накопитель:

а. Что оно делает

Роль Aggregator ожидает группу связанных сообщений. После того, как все ожидаемые сообщения будут получены, он сможет объединить их и отправить один результат. Агрегатор может обрабатывать различные групповые сообщения одновременно с помощью идентификатора групповой корреляции.

б. Почему это хорошо для меня?

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

с. Пример из реальной жизни

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

д. Пример SI:

<int:aggregator input-channel="bestPriceAgg" output-channel="bestPriceChannel"
send-partial-result-on-expiry="true">
</int:aggregator>

Фильтр:

а. Что оно делает

Короче говоря, он спрашивает: «Вы хотите получить это сообщение?»

б. Почему это хорошо для меня?

Вместо обработки ненужных сообщений вы можете фильтровать сообщения на основе полезной нагрузки сообщения (в мире EJB это очень похоже на селекторы bean-объектов, управляемые сообщениями).

с. Пример из реальной жизни

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

д. Пример SI:

<filter input-channel="commisionsChannel" ref="selector" output-channel="output"/>

Трансформатор:

а. Что оно делает

Преобразователь может получить сообщение и преобразовать его полезную нагрузку из одного типа в другой.

б. Почему это хорошо для меня?

Возможно, вам придется преобразовать ваше сообщение из одного формата в другой в зависимости от вашего места назначения.

Мне часто приходилось анализировать или преобразовывать сообщения в другие форматы после добавления / изменения / удаления содержимого полезной нагрузки (например, из XML в строку и наоборот).

с. Пример из реальной жизни

Итак, у вас есть запрос заказа. Этот запрос должен быть помещен в базу данных в определенном формате. После этого его необходимо отправить клиенту в формате XML. С помощью трансформатора вы можете преобразовать полезную нагрузку в соответствии с вашими требованиями.

д. Пример SI:

<object-to-string-transformer input-channel="in" output-channel="out"/>

В SI есть дополнительные компоненты, но я думаю, что они самые популярные.