Введение в Rabbitmq
Rabbitmq - это полная и многоразовая система обмена сообщениями предприятия, основанная на AMQP
MQ - полное имя очереди сообщений. Очередь сообщений (MQ) - это метод связи между приложениями и приложениями. Приложения общаются, читая и написав в очереди сообщения (данные для приложений) без выделенного соединения для их связи. Доставка сообщений относится к общению между программами путем отправки данных в сообщениях, а не при непосредственных вызовах друг друга, прямые вызовы обычно используются в таких методах, как вызовы удаленных процедур. Очередь относится к заявлению, общающемуся через очередь. Использование очередей устраняет требование о том, что как получение и отправка приложения выполняется одновременно.
AMQP-это протокол, протокол сообщения об сообщении уровня абстракции высокого уровня.
Хотя в мире синхронных сообщений существует много общественных стандартов (таких как Cobar IIOP, или мыло и т. Д.), Это не относится к асинхронной обработке сообщений. Только крупные компании имеют некоторые коммерческие реализации (например, Microsoft MSMQ, IBM WebSphere MQ и т. Д.). Поэтому в июне 2006 года Cisco, Redhat, Imatix и другие совместно сформулировали общественные стандарты для AMQP. Другими словами, AMQP является протоколом для асинхронного общения.
Сценарии использования Rabbitmq
В проекте некоторые трудоемкие операции, которые не требуют немедленного возврата, извлекаются и обрабатываются асинхронно. Эта асинхронная обработка значительно экономит время ответа на запрос сервера, тем самым повышая пропускную способность системы. Тем не менее, большинство из них не просто не обязаны мгновенно возвращать, и не имеет значения, является ли выполнение успешным или нет. Если вам нужен мгновенный возврат, вы можете использовать Dubbo. Spring Boot интегрируется с Dubbo, вы можете посмотреть интеграцию Spring Boot Dubbox
Зависимость кролика
RabbitMQ - это не простой пакет JAR (пакет JAR предоставляет только некоторые базовые функции связи с самим RabbitMQ). Подобно Dubbo, Rabbitmq также требует запуска другого программного обеспечения. Ниже приводится программное обеспечение, необходимое для запуска RabbitMQ.
1. Эрланг
Поскольку само программное обеспечение Rabbitmq разработано на основе Erlang, если вы хотите запустить Rabbitmq, вы должны сначала следовать Erlang
Официальный сайт Erlang
Эрланг загрузка Адрес
Rabbitmq
Rabbitmq является ядром реализации очередей сообщений
Официальный сайт Rabbitmq
Rabbitmq скачать
Настройка Rabbitmq
После завершения установки необходимо завершить некоторую конфигурацию перед использованием RabbitMQ. Вы можете напрямую использовать CMD в каталоге SBIN в рамках каталога установки RabbitMQ через конфигурацию команды, или вы можете напрямую найти командную строку RabbitMQ (SBIN DIR) в меню «Пуск», чтобы запустить SBIN непосредственно в каталог установки RabbitMQ. Для удобства мы сначала включим плагин управления и выполняем команды.
rabbitmq-plugins.bat включить rabbitmq_management
Правильно, обратите внимание, что это под окнами. Если это Linux, нет суффикса BAT. Затем мы добавляем пользователя, потому что соединение не может быть успешным без пользователей во внешней сетевой среде. Выполните команду ADD USER
rabbitmqctl.bat add_user password springboot пароль
Springboot - это имя пользователя, а пароль - это пароль
Затем, для удобства демонстрации, мы даем Springboot разрешения администратора для облегчения входа на страницу управления
Rabbitmqctl.bat set_user_tags Администратор Springboot
Дать разрешения аккаунта
rabbitmqctl.bat set_permissions -p / springboot.*.*.*.*
Затем запустите услугу Rabbitmq и посетите страницу управления Rabbitmq http: // localhost: 15672, чтобы увидеть страницу входа в систему. Если пользователь не создан, вы можете использовать гость и гость для входа в систему. Если есть созданный пользователь, используйте созданный пользователь для входа в систему. Если есть созданный пользователь, используйте созданный пользователь для входа в систему.
Создать проект Springboot
Поскольку я уже упоминал создание проекта Spring Boot в предыдущей статье много раз, я не буду много говорить здесь
Добавить зависимости, связанные с RabbitMQ
<!-Rabbitmq-> <Dependency> <groupId> org.springframework.boot </GroupId> <strifactid> Spring-boot-starter-amqp </artifactid> </depertive>
Правильно, лишь небольшая конфигурация, но я могу не понять таким образом, поэтому мне лучше опубликовать все конфигурации
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>wang.raye.rabbitmq</groupId> <artifactId>demo1</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <mame> demo1 </name> <url> http://maven.apache.org </url> <properties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> </properties> <graperiid> org.spramework. <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- Springboot --> <dependency> <groupId> org.springframework.boot </GroupId> <ArtifactId> Spring-boot-starter-web </artifactid> </depervice> <!-Rabbitmq-> <dependency> <groupid> org.springframework.boot </GroupD> <ratifactid> Spring-Starter-maMqp </artifactid> </Ground> <ratifactid> Spring-starter-Amqp </artifactid> </GroupD> <strifactid> spring-starter-amqp </artifactid> </GroupD> <ratifactid> spring-starter-mqp1 </Зависимости> </project>
Поскольку никаких других операций не выполнено, проект в настоящее время в основном опирается на два модуля, один ботинок с веточкой и один Rabbitmq
Добавить класс конфигурации
пакет wang.raye.rabbitmq.demo1; import org.springframework.amqp.core.acknowledgemode; Импорт org.springframework.amqp.core.binding; Импорт org.springframework.amqp.core.binding; Импорт org.springframework.amqp.core.bindingBuilder; Импорт org.springframework.amqp.core.directexchange; Импорт org.springframework.amqp.core.message; Импорт org.springframework.amqp.core.queue; Импорт org.springframework.amqp.rabbit.connection.cachingConnectionFactory; Импорт org.springframework.amqp.rabbit.connection.connectionFactory; Импорт org.springframework.amqp.rabbit.core.ChannelAwareMessAgeListener; Импорт org.springframework.amqp.rabbit.listener.simplemessageListenerContainer; Импорт org.springframework.context.annotation.bean; Import org.springframework.context.annotation.configuration;/*** Класс конфигурации Rabbitmq* @author raye* @since 12 октября 2016 г. 10:57:44*/ @configuration public class rabbitmqconfig {/** Название переключателя сообщения*/public Static final Exchange = "my-mq-exchange"; / ** queue Key1*/ public Static Final String RoutingKey1 = "queue_one_key1"; / ** queue Key2*/ public Static Final String RoutingKey2 = "queue_one_key2"; / *** Информация о ссылке конфигурации* @return*/ @bean public connectoryfactory connectionFactory () {cachingConnectionFactory ConnectionFactory = new CachingConnectionFactory ("127.0.0.1", 5672); connectionFactory.SetUSERNAME ("SpringBoot"); ConnectionFactory.SetPassword ("пароль"); ConnectionFactory.SetVirtualHost ("/"); ConnectionFactory.SetPublisherConfirms (True); // return ConnectionFactory должно быть установлено; } /** * Configure message switch* Configure FanoutExchange for consumers: Distribute messages to all bound queues, without the concept of routingkey HeadersExchange: match DirectExchange by adding attribute key-value: Distribute to the specified queue according to routingkey TopicExchange: Multi-key matching*/ @Bean public DirectExchange defaultExchange() { return new DirectExchange(EXCHANGE, true, false); } / ** * Настроить очередь сообщений 1 * Настройка для потребителей * @return * / @bean public queue queue () {return new queue ("queue_one", true); // Постоянное количество}/*** Привязанную очередь сообщений 1 с переключателем* Настройка для потребителей* @return*/@bean public inding sinting () {return bindingbuilder.bind (queue ()). To (defaultexchange ()). С (rabbitmqconfig.routingkey1); } / ** * Настройка очереди сообщений 2 * Настройка для потребителей * @return * / @bean public queue queue1 () {return new queue ("queue_one1", true); // быстрая стойкость}/*** Привязанную очередь сообщений 2 с переключателем* Настройка для потребителей* @return*/@bean public binding binding1 () {return bindingbuilder.bind (queue1 ()). To (defaultexchange ()). С (rabbitmqconfig.routingkey2); } / *** Примите прослушивание сообщения, этот слушатель примет сообщение из очереди сообщений 1* Настройка для потребителей* @return* / @bean public summeressagelistenercontainer messagecontainer () {summeressagelistenercontainer intainer = new SommeressageListeneraner (connectionFactory ();); Container.SetQueues (queue ()); container.setExposelistenerChannel (true); контейнер.setMaxConcurrentConsumers (1); контейнер.setConcurrentConsumers (1); container.setacknowledgemode (ancknowledgemode.manual); // Установить режим подтверждения вручную подтвердить контейнер.setmessageListener (новый канал wannelawaremessagelistener () {public void onmessage (сообщение сообщений, com.rabbitmq.client.calel Channel). Обращает исключение {byte [] body = message.getbody (); System.out.println («Сообщение получено:». + Новая строка (body); channel.basicack (message.getmessageproperties (). getDeliveryTag (), false); вернуть контейнер; } / *** Примите прослушивание сообщения, этот слушатель примет сообщение из очереди сообщений 1* Конфигурация для потребителей* @return* / @bean public summeressagelistenercontainer messagecontainer2 () {SimplemessagelistenerContainer container = new SimpleSessAgelistenErantainer (connectionFactory ()); Container.SetQueues (queue1 ()); container.setExposelistenerChannel (true); контейнер.setMaxConcurrentConsumers (1); контейнер.setConcurrentConsumers (1); container.setacknowledgemode (ancknowledgemode.manual); // Установить режим подтверждения вручную подтвердить intainer.setmessagelistener (new Channelawaremessagelistener () {public void onmessage (сообщение сообщением, com.rabbitmq.client.calel Channel) Throws Exception {byte [] body = message.getbody (); System.out.println ("Queue1 Сообщение получило:" + new String (body); channel.basicack (message.getmessageproperties (). getDeliveryTag (), false); вернуть контейнер; }}Обратите внимание, что чтобы лучше продемонстрировать, как настроить, я настроил две очереди сообщения. За исключением случаев, где конфигурация ссылки настроена, остальная часть этого класса нацелена на потребителей сообщений. Конечно, как потребители сообщений, так и производители сообщений должны настроить информацию о ссылке. Для удобства потребители сообщений и производители этого проекта находятся в этом проекте. Как правило, фактический проект не будет в том же проекте. Поскольку комментарии очень подробные, я не скажу много.
Отправить сообщение
Чтобы облегчить отправку сообщений, я напрямую написал контроллер, чтобы вызвать метод отправки сообщений путем доступа к интерфейсу. Без лишних слов, пожалуйста, добавьте код
пакет wang.raye.rabbitmq.demo1; import java.util.uuid; импорт org.springframework.amqp.rabbit.core.rabbittemplate; Импорт org.springframework.amqp.rabbit.support.correlationData; Импорт org.springframework.web.bind.annotation.requestmapping; Import org.springframework.web.bind.annotation.restcontroller;/** * Проверьте контроллер для Rabbitmq, чтобы отправлять сообщения * @author raye * */ @restcontrollerpublic class sendcontroller реализует Rabbittemplate.confirmcallback {private rabbittemplate rabbittemplater; /*** Настройте RabbitTemplate для отправки сообщений. Поскольку это конструктор, Spring будет автоматически вводить без аннотации (это должна быть особенность новой версии) * @param rabbittemplate */ public sendcontroller (rabbittemplate rabbittemplate) {rabbittemplate = rabbittemplate; // Установить обратный вызов потребления. } / ** * Отправить сообщение в очередь сообщений 1 * @param msg * @return * / @requestmapping ("send1") public String send1 (String msg) {string uuid = uuid.randomuuid (). ToString (); CorrelationData CORPESSENCEID = новая CorrelationData (UUID); rabbittemplate.convertandsend (rabbitmqconfig.exchange, rabbitmqconfig.routingkey1, msg, cropersenceid); вернуть ноль; } / ** * Отправить сообщение в очередь сообщений 2 * @param msg * @return * / @requestmapping ("send2") public String send2 (String msg) {string uuid = uuid.randomuuid (). ToString (); CorrelationData correlationId = новая корреляция adata (uuid); rabbittemplate.convertandsend (rabbitmqconfig.exchange, rabbitmqconfig.routingkey2, msg, correlationid); вернуть ноль; } / *** Обратный вызов сообщения, в основном реализующий интерфейс RabbitTemplate.confirmCallback* Обратите внимание, что обратные вызовы сообщения могут представлять только успешные сообщения, отправленные на сервер RabbitMQ, и не может представлять успешные сообщения, обрабатываемые и принятые* / public void Подтверждение (CorrelationData CorprocyCendata, Boolean Ack, String Cause). if (ack) {System.out.println ("Потребление сообщений не удалось:" + cause + "/n resend"); }}}Следует отметить, что обратные вызовы сообщения могут представлять только успешное сообщение, отправляемое на сервер RabbitMQ.
Затем мы запустим проект и посещаем http: // localhost: 8082/send1? Msg = aaaa, и вы обнаружите, что вывод консоли
Полученное сообщение: AAAA
ID обратного вызовов: CorrelationData [id = 37E6E913-835A-4ECA-98D1-807325C5900F]
Успешное потребление новостей
Конечно, идентификатор обратного вызова может быть другим. Если мы посетим http: // localhost: 8082/send2? Msg = bbbb, вывод будет
queue1 полученное сообщение: bbbb
ID обратного вызовов: CorrelationData [id = 0cec7500-3117-4aa2-9ea5-4790879812d4]
Успешное потребление новостей
Несколько слов в конце
Поскольку в этой статье в основном объясняется, как интегрировать RabbitMQ от нуля до Springboot, нет никакого объяснения для большого количества информации и использования Rabbitmq. Если вы не знакомы с самим Rabbitmq, вы можете проверить другие статьи о Rabbitmq и прикрепить демонстрацию этой статьи.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.