Обзор
Когда я брал интервью у Netease, интервьюер задал мне вопрос и сказал
После размещения заказа, если пользователь не платит и должен отменить заказ, что я могу сделать?
Мой ответ в то время заключался в том, чтобы использовать временную задачу для сканирования таблицы БД. Интервьюер был не очень удовлетворен и спросил:
Есть ли другой способ использовать временные задачи для достижения точных уведомлений в реальном времени?
Мой ответ в то время был:
Вы можете использовать очередь. После того, как заказ будет размещен, в очередь отправляется сообщение и указано время истечения срока действия. Как только время наступит, выполняется интерфейс обратного вызова.
После того, как интервьюер слушал, он перестал спрашивать. На самом деле, моя идея была правильной в то время, но я не был очень профессиональным. Профессиональная поговорка состоит в том, чтобы использовать отсроченные сообщения.
На самом деле, действительно есть некоторая проблема с использованием временных задач. Первоначальная бизнес -система надеется, что, если заказ не будет оплачен через 10 минут, заказ будет немедленно отменен, а инвентарь продукции будет выпущен. Однако, как только объем данных будет большим, время для получения неоплачиваемых данных заказа будет расширено. Некоторые заказы будут отменены через 10 минут, которые могут быть 15 минут, 20 минут и т. Д. Таким образом, инвентарь не будет выпущен во времени, а также повлияет на нечетное число. Используя сообщения задержки, операция отмены заказа теоретически может выполняться в соответствии с установленным временем.
В настоящее время большинство статей в Интернете об использовании RabbitMQ для реализации задерживаемых сообщений о том, как использовать очередь мертвой буквы RabbitMQ для реализации. Решение внедрения выглядит очень сложным и реализуется с использованием оригинального API клиента RabbitMQ, что еще более многословно.
Spring Boot завершил API клиента RabbitMQ, который намного проще в использовании. Вот подробное введение в то, как использовать Plug-In и Spring Boot для реализации задержки с отсроченными сообщениями.
Подготовка программного обеспечения
Эрланг
Версия, используемая в этой статье: Erlang 20.3
Rabbitmq
В этой статье используется оконная версия Rabbitmq, номер версии: 3.7.4
Rabbitmq_delayed_message_exchange плагин
Адрес загрузки плагина: http://www.rabbitmq.com/community-lugins.html
После открытия URL -адреса Ctrl + F и найдите Rabbitmq_delayed_message_exchange.
Помните, вы должны выбрать номер версии. Поскольку я использую Rabbitmq 3.7.4, соответствующий плагин Rabbitmq_delayed_message_exchange также должен выбрать 3.7.x.
Если вы не выберете правильную версию, вы столкнетесь с различными странными проблемами при использовании отсроченных сообщений, и в Интернете нет решения. Я боролся всю ночь из -за этой проблемы. Пожалуйста, не забудьте выбрать правильную версию плагина.
После загрузки плагина поместите его в каталог плагинов в каталоге установки RabbitMQ и запустите плагин, используя следующую команду:
Rabbitmq-Plugins включает rabbitmq_delayed_message_exchange
Если стартап успешно, появится следующее сообщение:
Следующие плагины были включены: rabbitmq_delayed_message_exchange
После того, как плагин успешно запущен, не забудьте перезапустить Rabbitmq, чтобы он вступил в силу.
Интегрированный Rabbitmq
Это очень просто, просто добавьте его в файл pom.xml проекта Maven
<Depective> <groupid> org.springframework.boot </GroupId> <artifactid> Spring-boot-starter-amqp </artifactid> </dependency>
Я использую 2.0.1.1. Для Spring Boot.
Далее добавьте конфигурацию Redis в файл Application.properties:
spring.rabbitmq.host = 127.0.0.1spring.rabbitmq.port = 5672spring.rabbitmq.username = гости
Определить ConnectionFactory и RabbitTemplate
Это также очень просто, код выглядит следующим образом:
пакет com.mq.rabbitmq; import org.springframework.amqp.rabbit.connection.cachingConnectionFactory; import org.springframework.amqp.rabbit.connection.connectionFactory; import.springframework.amqp.rabbit.core.rabbittyrate; org.springframework.boot.context.properties.configurationProperties; импорт org.springframework.context.annotation.bean; импорт org.springframework.context.annotation.configuration;@configuration@configurationproperties (prefix = "spring.rabbitmq") public rabbitm@configurationproperties (prefix = "spring.rabbitmq") uscientproperties (prefix = "spring.rabbitmq") usciTimferties (prefix = "spring.rabbitmq") частный порт int; частное имя пользователя; Private String Password; @Bean public connectionFactory ConnectionFactory () {CachingConnectionFactory CachingConnectionFactory = new CachingConnectionFactory (host, port); CachingConnectionFactory.SetUSERNAME (имя пользователя); CachingConnectionFactory.setPassword (пароль); CachingConnectionFactory.SetVirtualHost ("/"); CachingConnectionFactory.SetPublisherConfirms (True); вернуть CachingConnectionFactory; } @Bean public rabbittemplate rabbittemplate () {rabbittemplate rabbittemplate = new Rabbittemplate (connectionFactory ()); вернуть кролика; } public String gethost () {return Host; } public void sethost (string host) {this.host = host; } public int getPort () {return Port; } public void setport (int port) {this.port = port; } public String getUsername () {return username; } public void setUsername (string username) {this.username = username; } public String getPassword () {return пароль; } public void setPassword (String password) {this.password = password; }}Конфигурация обмена и очереди
Пакет com.mq.rabbitmq; import org.springframework.amqp.core.*; import org.springframework.context.annotation.bean; импорт org.springframework.context.annotation.configuration; import java.util.hashmap; import java.util.mapuration; @Bean public ustomexchange delayExchange () {map <string, object> args = new hashmap <> (); args.put ("x delayed-type", "Direct"); вернуть новый customexchange ("test_exchange", "x delayed-message", true, false, args); } @Bean public queue queue () {queue queue = new queue ("test_queue_1", true); вернуть очередь; } @Bean public spinting sinting () {return bindingbuilder.bind (queue ()). To (dowerexchange ()). С ("test_queue_1"). Noargs (); }}Здесь следует отметить, что используется CustomexChange, а не прямой обмен, и тип Customexchange должен быть X Delayed-Message.
Реализовать сообщение отправки
пакет com.mq.rabbitmq; import org.springframework.amqp.amqpexception; импорт org.springframework.amqp.core.message; импорт org.springframework.amqp.core.messagepostprocessor; import org.spramework.amqp.rabbite.rabbise.rabborteprabessor; импорт org.sprame. org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.service; import java.text.simpledateformat; импорт java.util.date; @servicepublic class speakingiMpl; @autowired private rabbitteplate rabbitteplate; public void sendmsg (String QueueName, String msg) {SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); System.out.println ("Сообщение Отправить время:"+sdf.format (new Date ())); rabbittemplate.convertandsend ("test_exchange", queename, msg, new messagepostprocessor () {@override public message postprocessmessage (сообщение сообщения) бросает amqpexception {message.getmessageproperties (). }}Обратите внимание, что при отправке должен быть добавлен заголовок
X-Delay
Время задержки, которое я установил здесь, составляет 3 секунды.
Потребители сообщений
пакет com.mq.rabbitmq; import org.springframework.amqp.rabbit.annotation.rabbithandler; import org.springframework.amqp.rabbit.antotation.rabbitlistener; import org.springframework.stepolypen.component; import.simpledateformatformatformatformateformatformatformatformatformatformatformatformate. java.util.date; @componentpublic class messagereceiver {@rabbitlistener (queues = "test_queue_1") public void checept (String msg) {Simpledateformat sdf = new SimpleDateformat ("yyyy-mm-dd HH: mm: ss"); System.out.println («Время приема сообщений:»+sdf.format (new Date ())); System.out.println ("Полученное сообщение:"+msg); }}Запустите программу Spring Boot и отправьте сообщения
Запустите программу Spring Boot непосредственно в основном методе, и Spring Boot автоматически проанализирует класс MessagereCeiver.
Затем просто используйте Junit, чтобы запустить интерфейс, который отправляет сообщение.
Пакет com.mq.rabbitmq; import org.junit.test; import org.junit.runner.runwith; import org.springframework.beans.factory.annotation.autowired; импорт org.springframework.boot.test.context.springboottest; org.springframework.test.context.junit4.springrunner; @runwith (springrunner.class) @springboottestpublic class rabbitmqapplicationtests {@autowired private messageServiceImplesservice; @Test public void send () {omeleaser service.sendmsg ("test_queue_1", "Привет, я задержка msg"); }} После запуска вы можете увидеть следующую информацию:
Сообщение Время отправки: 2018-05-03 12:44:53
Через 3 секунды вывод будет выведена консоль Spring Boot:
Время приема сообщения: 2018-05-03 12:44:56
Полученное сообщение: Здравствуйте, я задерживаю MSG
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.