«1. Обзор

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

2. Коммуникация на основе сообщений

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

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

3. AMQP — расширенный протокол организации очереди сообщений

AMQP — это открытый стандарт проводной спецификации для асинхронной передачи сообщений. Он содержит описание того, как должно быть построено сообщение.

3.1. Чем Amqp отличается от Jms

Поскольку AMQP является стандартом бинарного протокола, не зависящим от платформы, библиотеки могут быть написаны на разных языках программирования и работать в разных средах.

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

3.2. Объекты AMQP

Вкратце, AMQP состоит из обменов, очередей и привязок:

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

Для получения дополнительной информации см. Концепции AMQP и топологии маршрутизации.

3.3. Spring AMQP

Spring AMQP состоит из двух модулей: spring-amqp и spring-rabbit. Вместе эти модули обеспечивают абстракции для:

    сущностей AMQP — мы создаем сущности с помощью классов Message, Queue, Binding и Exchange. Управление соединениями — мы подключаемся к нашему брокеру RabbitMQ с помощью CachingConnectionFactory Message Publishing — мы используем RabbitTemplate для отправки сообщений Потребление сообщений — мы используем @RabbitListener для чтения сообщений из очереди

4. Настройка брокера Rabbitmq

Нам нужен брокер RabbitMQ, доступный для подключения. Самый простой способ сделать это — использовать Docker для извлечения и запуска образа RabbitMQ для нас:

docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management

Мы открываем порт 5672, чтобы наше приложение могло подключаться к RabbitMQ.

И мы открываем порт 15672, чтобы мы могли видеть, что делает наш брокер RabbitMQ, либо через пользовательский интерфейс управления: http://localhost:15672, либо через HTTP API: http://localhost:15672/api/index. HTML.

5. Создание нашего приложения Spring Amqp

Итак, теперь давайте создадим наше приложение для отправки и получения простого сообщения «Hello, world!» с помощью Spring AMQP.

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

Чтобы добавить модули spring-amqp и spring-rabbit в наш проект, мы добавляем зависимость spring-boot-starter-amqp в наш pom.xml:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>2.2.2.RELEASE</version>
    </dependency>
</dependencies>

Мы можем найти последнюю версию версия в Maven Central.

5.2. Подключение к нашему брокеру Rabbitmq

Мы будем использовать автоконфигурацию Spring Boot для создания компонентов ConnectionFactory, RabbitTemplate и RabbitAdmin. В результате мы получаем подключение к нашему брокеру RabbitMQ на порту 5672, используя имя пользователя и пароль по умолчанию «guest». Итак, мы просто аннотируем наше приложение с помощью @SpringBootApplication:

@SpringBootApplication
public class HelloWorldMessageApp {
   // ...
}

«

«5.3. Создайте нашу очередь

@Bean
public Queue myQueue() {
    return new Queue("myQueue", false);
}

Чтобы создать нашу очередь, мы просто определяем bean-компонент типа Queue. RabbitAdmin найдет это и привяжет к обмену по умолчанию с ключом маршрутизации «myQueue»: остановлен. Обратите внимание, однако, что перезапуск нашего приложения не повлияет на очередь.

5.4. Отправка нашего сообщения

Давайте воспользуемся шаблоном RabbitTemplate для отправки нашего сообщения «Привет, мир!»:

rabbitTemplate.convertAndSend("myQueue", "Hello, world!");

5.5. Потребляйте наше сообщение

Мы реализуем потребителя сообщения, аннотируя метод с помощью @RabbitListener:

@RabbitListener(queues = "myQueue")
public void listen(String in) {
    System.out.println("Message read from myQueue : " + in);
}

6. Запуск нашего приложения

Сначала мы запускаем брокера RabbitMQ:

docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management

Затем , мы запускаем приложение весенней загрузки, запустив HelloWorldMessage.java, выполнив метод main():

mvn spring-boot:run -Dstart-class=com.baeldung.springamqp.simple.HelloWorldMessageApp

Во время работы приложения мы увидим, что:

    Приложение отправляет сообщение на обмен по умолчанию с помощью â “myQueue” в качестве ключа маршрутизации Затем очередь “myQueue” получает сообщение Наконец, метод listen принимает сообщение из “myQueue” и выводит его на консоль

Мы также можем использовать страницу управления RabbitMQ по адресу http ://localhost:15672, чтобы убедиться, что наше сообщение отправлено и использовано.

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

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

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