Статьи

Ключевые замечания по Spring Integration со сценариями из реальной жизни

В этом посте будут обобщены важные ключевые замечания Spring Integration (SI) вместе с шаблонами интеграции обмена сообщениями. Для каждой ключевой заметки я добавлю пример из реальной жизни, основанный на моем опыте.

Разветвитель

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

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

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

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

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

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

С Splitter вы можете сделать все сразу.

д. Пример СИ:

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

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

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

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

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

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

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

Таким образом, у вас есть функция уведомления в вашей инфраструктуре. Каждый клиент хотел, чтобы его заметили по-разному (электронная почта, SMS, факс, веб-сервис и т. Д.). Запрос на уведомление отправляется клиенту и на основании содержимого запроса маршрутизатор будет выбирать, к какому компоненту будет отправлен запрос: EmailService, SmscService, FaxService и т. Д.

д. Пример СИ:

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

Агрегатор

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

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

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

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

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

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

д. Пример СИ:

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

Фильтр

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

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

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

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

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

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

д. Пример СИ:

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

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

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

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

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

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

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

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

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

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

д. Пример СИ:

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

В СИ есть дополнительные компоненты. Это самые популярные из них.

Справка: ключевые замечания Spring Integration с реальными сценариями от нашего партнера по JCG Идана Фридмана в блоге IdanFridman.com .