1. Предисловие
В промежуточном программном обеспечении сообщений есть 2 важных концепция: брокер сообщений и пункт назначения. Когда отправитель сообщений отправляет сообщение, сообщение захватывается брокером сообщений, что гарантирует, что сообщение доставляется в указанный пункт назначения.
Наши обычно используемые брокеры сообщения включают спецификации JMS и AMQP. Соответственно, их общими реализациями являются ActiveMQ и RabbitMQ.
2. Интегрировать ActiveMQ
2.1 Добавить зависимости
<Depective> <groupId> org.springframework.boot </GroupId> <ArtifactId> Spring-boot-Starter-Activemq </artifactid> </depertive> <!-Если вам необходимо настроить пул соединений, добавьте следующие зависимости-> artifactid> artificid> artifactid> <preatifid> <groupid> arg.ActheIvemq </Зависимость>
2.2 Добавить конфигурацию
# ActiveMQ Configure Spring.Activemq.Broker-URL = TCP: //192.168.2.12: 61616Spring.Activemq.user = adminspring.activemq.password = adminspring.activemq.pool.ensabled = falsespring.activemq.pool.max-connection = 50## andabled = falsespring.activemq.pool.max-connection = 50## andabled = commentistr должен быть установлен на truepring.jms.pub-sub-domain = false
Здесь spring.activemq.pool.enabled = false означает закрытие пула соединений.
2.3 Кодирование
Класс конфигурации:
@Configurationpublic class jmsconfirguration {public static final String queue_name = "activemq_queue"; public Static Final String TOMA_NAME = "ActiveMQ_TOPIC"; @Bean public queue queue () {return new ActiveMqqueue (queue_name); } @Bean Public Tope Topic () {return new ActiveMQTopic (TOMA_NAME); }}Отвечает за создание очередей и тем.
Производитель сообщений:
@Componentpublic class jmssender {@autowired частная очередь очереди; @Autowired частная тема; @Autowired private jmsmessagingtemplate jmstemplate; public void sendbyqueue (строковое сообщение) {this.jmstemplate.convertandsend (queue, message); } public void sendbytopic (String Message) {this.jmstemplate.convertandSend (тема, сообщение); }}Потребитель сообщений:
@Componentpublic class jmsreceiver {@jmslistener (destination = jmsconfirguration.queue_name) public void cheactBiequeue (String Message) {System.out.println («Сообщение о получении очереди:» + Message); } @Jmslistener (destination = jmsconfirguration.topic_name) public void eCetibytopic (String Message) {System.out.println («Получение темы:« + сообщение); }}Потребители сообщений слушают сообщения, используя аннотацию @jmslistener.
2.4 Тест
@Runwith (springrunner.class) @springboottestpublic class jmstest {@autowired private jmssender sender; @Test public void testsendbyqueue () {for (int i = 1; i <6; i ++) {this.sender.sendbyqueue ("hello activemq queue"+i); }} @Test public void testsendbytopic () {for (int i = 1; i <6; i ++) {this.sender.sendbytopic ("hello activemq topic"+i); }}}Результат печати:
Получить очередь: привет очередь ActiveMQ 1
Получить Сообщение в очереди: Привет, очередь ActiveMQ 2
Получить сообщение очереди: Привет, очередь ActiveMQ 3
Получить сообщение очереди: Привет, очередь ActiveMQ 4
Получить сообщения очереди: Привет, очередь ActiveMQ 5
Установить Spring.jms.pub-sub-domain = true при тестировании режима публикации/подписки
Получить тематическое сообщение: Привет, ActiveMQ Тема 1
Получить тематическое сообщение: Привет, ActiveMQ Тема 2
Получить тематические сообщения: привет ActiveMQ Тема 3
Получить тематические сообщения: привет ActiveMQ Тема 4
Получить тематические сообщения: привет ActiveMQ Тема 5
3. Интеграция Rabbitmq
3.1 Добавить зависимости
<Depective> <groupid> org.springframework.boot </GroupId> <artifactid> Spring-boot-starter-amqp </artifactid> </dependency>
3.2 Добавить конфигурацию
spring.rabbitmq.host = 192.168.2.30spring.rabbitmq.port = 5672spring.rabbitmq.username = lightspring.rabbitmq.password = lightspring.rabbitmq.virtual-host =/test
3.3 Кодирование
Класс конфигурации:
@Configurationpublic class amqpconfirguration {// ============================================================================== @Bean public queue queue () {вернуть новую очередь (simple_queue, true); } // ================ Public Static Final String PS_QUEUE_1 = "PS_QUEUE_1"; Общественная статическая конечная строка ps_queue_2 = "ps_queue_2"; public Static Final String fanout_exchange = "fanout_exchange"; @Bean public queue psqueue1 () {вернуть новую очередь (ps_queue_1, true); } @Bean public queue psqueue2 () {вернуть новую очередь (ps_queue_2, true); } @Bean public fanoutexchange fanoutexchange () {return new fanoutexchange (fanout_exchange); } @Bean public spinting fanoutbinding1 () {return bindingbuilder.bind (psqueue1 ()). To (fanoutexchange ()); } @Bean public spinting fanoutbinding2 () {return bindingbuilder.bind (psqueue2 ()). To (fanoutexchange ()); } // ======================== public Static Final String Routing_queue_2 = "Routing_queue_2"; Public Static Final String Direct_Exchange = "Direct_exchange"; @Bean public queue routingqueue1 () {вернуть новую очередь (routing_queue_1, true); } @Bean public queue queue routingqueue2 () {вернуть новую очередь (routing_queue_2, true); } @Bean public directExchange directExchange () {return new DirectExchange (direct_exchange); } @Bean public spinting directbinding1 () {return bindingbuilder.bind (routingqueue1 ()). To (directExchange ()). С ("user"); } @Bean public spectivebinding2 () {return bindingbuilder.bind (routingqueue2 ()). To (directExchange ()). С ("order"); } // ============= Режим темы ======================================== public Static Final String TOMA_QUEUE_2 = "TOMA_QUEUE_2"; public Static Final String TOMA_EXCHANGE = "TOMA_EXCHANGE"; @Bean public queue teapqueue1 () {return new queue (toma_queue_1, true); } @Bean public queue topeaqueue2 () {return new queue (toma_queue_2, true); } @Bean public tapicexchange tapicexchange () {return new tapicexchange (toma_exchange); } @Bean public spinting topeBinding1 () {return bindingbuilder.bind (topicqueue1 ()). To (tapicexchange ()). С ("user.add"); } @Bean public specting topebinding2 () {return bindingbuilder.bind (topicqueue2 ()). To (tapicexchange ()). С ("user.#"); }}Rabbitmq имеет несколько рабочих режимов, поэтому существует много конфигураций. Читатели, которые хотят знать о соответствующем контенте, могут проверить «Введение в рабочую режим Rabbitmq» или информацию, связанную с Baidu, самостоятельно.
Производитель сообщений:
@Componentpublic class amqpsender {@autowired private amqptemplate amqptemplate; / ** * Simple Mode Send * * @param message */ public void simplesend (строковое сообщение) {this.amqptemplate.convertandsend (amqpconfirguration.simple_queue, message); }/** * Опубликовать/подписать режим Отправить * * @param Message */public void pssend (String message) {this.amqptemplate.convertandsend (amqpconfirguration.fanout_exchange, "", message); } / ** * Отправить в режиме маршрутизации * * @param message * / public void Routingsend (String RoutingKey, String Message) {this.amqptemplate.convertandSend (amqpconfirguration.direct_exchange, routingKey, сообщение); } / ** * Отправить в режиме темы * * @param RoutingKey * @param Message * / public void Themicsend (String RoutingKey, String Message) {this.amqptemplate.convertandSend (amqpconfirguration.topic_exchange, routingkey, message); }}Потребитель сообщений:
@Componentpublic class amqpreceiver { / ** * umy mode reception * * @param message * / @rabbitlistener (queues = amqpconfirguration.simple_queue) public void simpleceive (строковое сообщение) {System.out.println («Получите сообщение:» Сообщение); }/** * Опубликовать/подписать режим регистрации * * * @param message */@rabbitlistener (queues = amqpconfirguration.ps_queue_1) public void psreceive1 (String Message) {System.out.println (amqpconfirguration.ps_queue_1 + » } @Rabbitlistener (queues = amqpconfirguration.ps_queue_2) public void psReceive2 (String Message) {System.out.println (amqpconfirguration.ps_queue_2 + "Приемное сообщение:" + сообщение); } / ** * Прием режима маршрутизации * * @param Сообщение * / @rabbitlistener (queues = amqpconfirguration.routing_queue_1) public void RoutingReceive1 (String Message) {System.out.println (amqpConfirguration.Routing_Que_1 + »Получите сообщение:" + сообщение); } @Rabbitlistener (queues = amqpconfirguration.routing_queue_2) public void RoutingReceive2 (String Message) {System.out.println (amqpconfirguration.routing_queue_2 + " } / ** * Прием режима темы * * @param message * / @rabbitlistener (queues = amqpconfirguration.topic_queue_1) public void topiceReve1 (String Message) {System.out.println (amqpconfirguration.topic_queue_1 + " } @Rabbitlistener (queues = amqpconfirguration.topic_queue_2) public void TeapReceive2 (String Message) {System.out.println (amqpconfirguration.topic_queue_2 + " }}Потребители сообщений слушают сообщения, используя аннотацию @RabbitListener.
3.4 Тест
@Runwith (springrunner.class) @springboottestpublic class amqptest {@autowired private amqpsender sender; @Test public void testsimplesend () {for (int i = 1; i <6; i ++) {this.sender.simplesend ("test simplesend"+i); }} @Test public void testpssend () {for (int i = 1; i <6; i ++) {this.sender.pssend ("test pssend"+i); }} @Test public void testpssend () {for (int i = 1; i <6; i ++) {this.sender.pssend ("test pssend"+i); }} @Test public void testroutingingsend () {for (int i = 1; i <6; i ++) {this.sender.routingsend ("order", "test roudingsend"+i); }} @Test public void testtopicsend () {for (int i = 1; i <6; i ++) {this.sender.topicsend ("user.add", "Тематические темы"+i); }}}Результаты испытаний пропущены. Полем Полем
Напоминание 1: access_refused Login был отказан с использованием механизма аутентификации.
Решение:
1) Убедитесь, что имя пользователя и пароль верны. Важно отметить, содержат ли значения имени пользователя и пароля пробелы или вкладки (автор проверил его, потому что у пароля был еще один символ вкладки, что вызвало сбой аутентификации).
2) Если тестовая учетная запись использует гость, вам необходимо изменить файл rabbitmq.conf. Добавьте в файл конфигурацию «loopback_users = none».
Не могу приготовить очередь для слушателя. Либо очередь не существует, либо брокер не позволит нам использовать ее
Решение:
Мы можем войти в интерфейс управления RabbitMQ и вручную добавить соответствующую очередь в опцию очереди.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.