JmsTemplate легко для простой отправки сообщений. Что если мы хотим добавить заголовки, перехватить или преобразовать сообщение? Тогда мы должны написать больше кода. Итак, как мы можем решить эту общую задачу с большей настраиваемостью вместо большего количества кода? Сначала рассмотрим JMS весной.
Опции Spring JMS
- JmsTemplate — отправлять и получать сообщения встроенными
- Используйте методы send () / convertAndSend () для отправки сообщений
- Используйте методы receive () / receiveAndConvert () для получения сообщений. ВНИМАНИЕ: это методы блокировки! Если в пункте назначения нет сообщений, он будет ждать, пока сообщение не будет получено или не истечет время ожидания.
- MessageListenerContainer — асинхронный прием сообщений JMS путем опроса адресатов JMS и направления сообщений в методы обслуживания или MDB
И JmsTemplate, и MessageListenerContainer были успешно реализованы в приложениях Spring. Если нам нужно сделать что-то немного другое, мы вводим новый код. Что возможно могло пойти не так?
Расширяемость в будущем?
Во многих проектах возникают новые варианты использования, такие как:
- Направлять сообщения в разные пункты назначения, основываясь на значениях заголовка или содержимом?
- Записать содержимое сообщения?
- Добавить значения заголовка?
- Буферизировать сообщения?
- Улучшенный ответ и обработка ошибок?
- Внести изменения в конфигурацию без перекомпиляции ?
- и больше…
Теперь нам нужно провести рефакторинг кода и ввести новый код и тестовые случаи, запустить его через QA и т. Д. И т. Д.
Более настраиваемое решение!
Настало время закончить Spring JmsTemplate и поиграть с большими детьми. Мы можем легко сделать это с потоком Spring Integration.
Как это делается с помощью Spring Integration
Здесь у нас есть диаграмма, иллюстрирующая 3 простых компонента Spring Integration, заменяющих отправку JmsTemplate.
- Создайте интерфейс шлюза — интерфейс, определяющий методы, которые принимают тип данных, которые вы хотите отправить, и любые необязательные значения заголовка.
- Определить канал — канал, соединяющий наши конечные точки
- Определить исходящий адаптер JMS — отправляет сообщение вашему поставщику JMS (ActiveMQ, RabbitMQ и т. Д.)
Просто внедрите это в наши классы обслуживания и вызовите методы.
Немедленные выгоды
- Добавить заголовок и значения заголовка с помощью методов, определенных в интерфейсе
- Простой вызов методов Gateway из наших классов обслуживания
- Методы с несколькими шлюзами
- Настройте места назначения уровня уровня или класса
Будущие выгоды
- Измените адаптер JMS (односторонний) на шлюз JMS (двусторонний) для обработки ответов от JMS
- Мы можем изменить канал в очередь (буферизованный) канал
- Мы можем подключить трансформатор для преобразования сообщений
- Мы можем подключить дополнительные пункты назначения, подключить маршрутизатор «заголовок (ключ), значение заголовка или содержимое» и добавить еще один адаптер
- Мы можем подключить другие входящие адаптеры, получающие данные из другого источника, например SMTP, FTP, File и т. Д.
- Прослушайте канал, чтобы отправить копию сообщения в другое место.
- Измените канал на канал адаптера регистрации, который предоставил бы нам регистрацию сообщений, проходящих через
- Добавьте опцию « message-history » в нашу конфигурацию SI, чтобы отслеживать сообщение по его маршруту
- и больше…
Оптимальное решение для отправки JMS
Интерфейс Spring Integration Gateway
Шлюз обеспечивает одно или двухстороннее взаимодействие с Spring Integration. Если метод возвращает void, он по своей сути односторонний.
Интерфейс MyJmsGateway, имеет один метод Gateway, объявленный sendMyMessage (). Когда этот метод вызывается вашим классом обслуживания, первый аргумент войдет в поле заголовка сообщения с именем «myHeaderKey», второй аргумент переходит в полезную нагрузку.
Конфигурация Spring Integration
Поскольку интерфейс проксируется во время выполнения, нам необходимо настроить шлюз через XML.
Отправка сообщения
Резюме
- Простая реализация
- Вызовите метод для отправки сообщения в JMS — Very SOA, а?
- Гибкая конфигурация
- Переконфигурируйте и перезапустите БЕЗ перекомпиляции — СЛАДКИЙ!