Обмен сообщениями с Spring AMQP

1. Обзор

В этой статье мы рассмотрим обмен сообщениями на основе обмена сообщениями по протоколу AMQP с использованием среды Spring AMQP. Во-первых, мы рассмотрим некоторые ключевые концепции обмена сообщениями и перейдем к практическим примерам в разделе 5.

1.1. Зависимости Maven

Чтобы использовать spring-amqp и spring-rabbit в вашем проекте, просто добавьте эти зависимости:

<dependencies>
    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-amqp</artifactId>
        <version>1.6.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-rabbit</artifactId>
        <version>1.6.6.RELEASE</version>
    </dependency>
</dependencies>

Вы найдете самые новые версии в https://search.maven.org/classic/#search%7Cga%7C1%7C(g%3A%22org.springframework.amqp%22%20AND%20a%3A%22spring-amqp % 22)% 20OR% 20 (г% 3A% 22org.springframework.amqp% 22% 20AND% 20a% 3A% 22 весна-кролик% 22)[хранилище Maven].

** 2. Обмен сообщениями на основе____

__ **

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

В случае взаимодействия между приложениями, написанными на Java, JMS (Java Message Service) API обычно используется для отправки и получения сообщений. Для обеспечения взаимодействия между различными поставщиками и платформами мы не сможем использовать клиентов и брокеров JMS. Вот где AMQP пригодится.

** 3. AMQP - расширенный протокол очереди сообщений____

__ **

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

3.1. Чем AMQP отличается от JMS

Поскольку AMQP - это независимый от платформы стандарт двоичного протокола, эта характеристика позволяет писать библиотеки на разных языках программирования и работать на разных операционных системах и архитектурах ЦП.

Отсутствует блокировка протокола на основе поставщика, как в случае перехода от одного JMS-брокера к другому. Для получения дополнительной информации обратитесь к JMS vs AMQP и Understanding AMQP . Некоторые из широко используемых брокеров AMQP - RabbitMQ _, _ OpenAMQ и StormMQ.

** 3.2. AMQP Entities____

__ **

  • Объекты AMQP включают биржи, очереди и привязки: **

  • Обмены как почтовые отделения или почтовые ящики и клиенты всегда

опубликовать сообщение для обмена AMQP ** Очереди связываются для обмена с помощью ключа привязки. Привязка - это «ссылка»

что вы настроили для привязки очереди к обмену ** Сообщения отправляются брокеру/обмену сообщениями с помощью ключа маршрутизации.

Затем exchange распространяет копии сообщений в очереди. Exchange предоставляет абстракцию для достижения различных маршрутов обмена сообщениями, таких как разветвление, иерархическая маршрутизация и т. Д.

3.3. Типы обмена

, Существует четыре встроенных типа обмена:

  • Прямой обмен

  • Fanout Exchange

  • Обмен темами

  • Обмен заголовками

Для получения более подробной информации, посмотрите AMQP Concepts и https://spring.io/blog/2011/04/01/routing-topologies- для производительности и масштабируемости с rabbitmq/[Routing Topologies.]

** 4. Весенний AMQP____

__ **

Spring AMQP состоит из двух модулей: spring-amqp и spring-rabbit, каждый из которых представлен банкой в ​​распределении. весна-

Spring-amqp является базовой абстракцией, и вы найдете классы, которые представляют основную модель AMQP: Exchange, Queue и Binding.

Ниже мы рассмотрим особенности весны и кролика в этой статье.

** 4.1. Особенности Spring-amqp

__ **

  • Абстракция на основе шаблона - интерфейс AMQPTemplate определяет все

основные операции для отправки/получения сообщений, с RabbitTemplate как реализация Подтверждения издателя/Благодарности для потребителей ** Поддержка

  • AmqpAdmin tool, позволяющий выполнять основные операции

** 4.2. Весенний кролик Особенности____

__ **

Модель AMQP и связанные с ней объекты, которые мы обсуждали выше, являются общими и применимы ко всем реализациям. Но есть некоторые особенности, которые являются специфическими для реализации. Несколько из тех особенностей кролика весны объяснены ниже.

  • Поддержка управления соединениями ** - org.springframework.amqp.rabbit.connection.ConnectionFactory интерфейс - это центральный компонент для управления соединениями с брокером RabbitMQ. Ответственность реализации CachingConnectionFactory интерфейса ConnectionFactory заключается в предоставлении экземпляра интерфейса org.springframework.amqp.rabbit.connection.Connection .

Обратите внимание, что spring-rabbit предоставляет интерфейс Connection в качестве оболочки поверх интерфейса com.rabbitmq.client.Connection клиента RabbitMQ

  • Асинхронное потребление сообщений ** . Для асинхронного потребления сообщений используются две основные концепции: обратный вызов и контейнер. Обратный вызов - это место, где код вашего приложения будет интегрирован с системой обмена сообщениями.

Один из способов кодирования обратного вызова - предоставить реализацию интерфейса MessageListener :

public interface MessageListener {
    void onMessage(Message message);
}

Для четкого разделения кода приложения и API обмена сообщениями Spring AMQP также предоставляет MessageListenerAdapter . Вот пример конфигурации bean-компонента Spring для контейнера слушателя:

MessageListenerAdapter listener = new MessageListenerAdapter(somePojo);
listener.setDefaultListenerMethod("myMethod");

Теперь, когда мы увидели различные варианты обратного вызова прослушивания сообщений, мы можем обратить наше внимание на контейнер. По сути, контейнер обрабатывает «активные» обязанности, так что обратный вызов слушателя может оставаться пассивным. Контейнер является примером компонента жизненного цикла. Он предоставляет методы для запуска и остановки.

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

** 5. Отправка и получение сообщений с помощью Spring AMQP____

__ **

Вот шаги для отправки и получения сообщения через Spring AMQP:

, Настройка и запуск брокера RabbitMQ - Установка и настройка RabbitMQ

просто, просто следуйте инструкциям here , Настройка Java-проекта - Создание Java-проекта на основе Maven с

упомянутые выше зависимости , Внедрение Message Producer - Мы можем использовать RabbitTemplate для отправки

Сообщение «Привет, мир!»:

AbstractApplicationContext ctx
  = new ClassPathXmlApplicationContext("beans.xml");
AmqpTemplate template = ctx.getBean(RabbitTemplate.class);
template.convertAndSend("Hello, world!");

, Реализация потребителя сообщений - Как обсуждалось ранее, мы можем реализовать

потребитель сообщения как POJO:

public class Consumer {
    public void listen(String foo) {
        System.out.println(foo);
    }
}

, Зависимости проводки - Мы будем использовать следующий боб

Конфигурация для настройки очередей, обмена и других объектов. Большинство записей говорят сами за себя. Очередь с именем «myQueue» связана с обменом темами «myExchange» с использованием «foo. ** » В качестве ключа привязки.

RabbitTemplate был настроен для отправки сообщений на обмен myExchange с использованием foo.bar в качестве ключа маршрутизации по умолчанию. ListenerContainer обеспечивает асинхронную доставку сообщений из очереди «myQueue» в метод listen () класса Foo :

<rabbit:connection-factory id="connectionFactory"
  host="localhost" username="guest" password="guest"/>

<rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
    exchange="myExchange" routing-key="foo.bar"/>

<rabbit:admin connection-factory="connectionFactory"/>

<rabbit:queue name="myQueue"/>

<rabbit:topic-exchange name="myExchange">
    <rabbit:bindings>
        <rabbit:binding queue="myQueue" pattern="foo.** "/>
    </rabbit:bindings>
</rabbit:topic-exchange>

<rabbit:listener-container connection-factory="connectionFactory">
    <rabbit:listener ref="consumer" method="listen" queue-names="myQueue"/>
</rabbit:listener-container>

<bean id="consumer" class="com.baeldung.springamqp.consumer.Consumer"/>
  • Примечание ** : по умолчанию для подключения к локальному экземпляру RabbitMQ используйте имя пользователя «гость» и пароль «гость».

, Запустите приложение:

  • Первый шаг - убедиться, что RabbitMQ работает, порт по умолчанию

  • Запустите приложение, запустив Producer.java , выполнив main ()

метод ** Производитель отправляет сообщение «myExchange» с «foo.bar» в качестве

ключ маршрутизации ** Согласно ключу привязки myQueue, он получает сообщение

  • Foo класс, который является потребителем сообщений «myQueue» с listen ()

метод в качестве обратного вызова получает сообщение и печатает его на консоли

6. Заключение

В этой статье мы рассмотрели архитектуру обмена сообщениями по протоколу AMQP, используя Spring AMQP для связи между приложениями.

Полный исходный код и все фрагменты кода для этой статьи доступны на the проект GitHub .