Введение в механизм повтора RabbitMQ
RabbitMQ не устанавливает время истечения срока действия для неподтвержденных сообщений. Единственной основой для определения необходимости повторной доставки сообщения потребителю является то, было ли отключено соединение для использования сообщения. Причиной этого параметра является время, в течение которого RabbitMQ позволяет потребителям. потреблять сообщение. Это может занять очень много времени.
На платформе веб-управления RabbitMQ вы можете увидеть количество сообщений в состоянии «Готово» и «Неподтверждено» в текущей очереди, что соответственно соответствует количеству сообщений, ожидающих доставки потребителю, и сообщений, которые уже были доставлены потребителю, но не получили номер подтверждения. Как показано ниже:
Автоматическое подтверждение разделено на четыре ситуации (первая — нормальное потребление, остальные три — нештатные ситуации)
Я столкнулся с четвертой ситуацией, из-за которой сообщение mq было заблокировано, и потребитель продолжал использовать одно и то же сообщение, а затем выдал исключение, а затем вошел в бесконечный цикл. Если сообщение не подтверждено, это показано на рисунке ниже:
spring:
# Название проекта
application:
name: rabbitmq-consumer
# RabbitMQСлужить Конфигурация rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
listener:
simple:
# Механизм повтора
retry:
enabled: true #Включить ли повторную попытку потребителя
max-attempts: 5 #Максимальное количество повторов
initial-interval: 5000ms #Интервал повтора (единица миллисекунды)
max-interval: 1200000ms #Максимальный интервал повтора (в миллисекундах)
multiplier: 2 #Множитель интервала времени, интервал времени * множитель = следующий из интервала времени, максимум не может превышать установленный из максимального интервала времени
Ниже будет объяснена реализация механизма повторных попыток RabbitMQ на примерах. Во-первых, вам необходимо создать два проекта SpringBoot и интегрировать клиент RabbitMQ.
В файле информации конфигурации pom.xml добавьте соответствующие файлы зависимостей:
<!-- AMQP-клиент -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.4.1</version>
</dependency>
Настройте службу RabbitMQ в файле конфигурации application.yml:
spring:
# Название проекта
application:
name: rabbitmq-provider
# RabbitMQСлужить Конфигурация rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
существовать rabbitmq-provider(элементы отправки сообщений)середина,Настроить поочередно назовите и передайтепоочередно IoC Управление, код следующий:
package com.pjb.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Класс RabbitMQConfiguration
* @author pan_junbiao
**/
@Configuration
public class RabbitMqConfig
{
public static final String QUEUE_NAME = "queue_name"; //очередьимя public static final String EXCHANGE_NAME = "exchange_name"; //Название обменника
public static final String ROUTING_KEY = "routing_key"; //ключ маршрутизации
/**
* очередь
*/
@Bean
public Queue queue()
{
/**
* Createturn, описание параметра:
* String name:очередьимя。 * boolean прочный: установите, будет ли сохраняться, значение по умолчанию — false。durable установлен на true Это означает настойчивость, иначе это означает ненастойчивость.
* Изочередность персистентности будет сохранена на диске, и соответствующая информация не будет потеряна при перезапуске сервера.
* boolean эксклюзивный: установите, будет ли он эксклюзивным, по умолчанию также ЛОЖЬ. для true Затем установите режим эксклюзивного доступа.
* boolean autoDelete: установите, следует ли удалять автоматически, т.е. true Затем установите автоматическое удаление,
* Если ни один производитель или потребитель не использует эту очередь, она автоматически удаляется.
* Map<String, Object> аргументы: установите некоторые другие параметры.
*/
return new Queue(QUEUE_NAME, true, false, false, null);
}
/**
* Прямой переключатель
*/
@Bean
public DirectExchange exchange()
{
/**
* Создание обменника, описание параметров:
* String имя: имя переключателя
* boolean прочный: установите, будет ли сохраняться, значение по умолчанию — false。durable установлен на true Это означает настойчивость, иначе это означает ненастойчивость.
* Постоянство позволяет сохранить переключатель на диск, чтобы соответствующая информация не потерялась при перезапуске сервера.
* boolean autoDelete: установите, следует ли удалять автоматически, т.е. true Затем установите автоматическое удаление,
*/
return new DirectExchange(EXCHANGE_NAME, true, false);
}
/**
* обязательность
*/
@Bean
Binding binding(DirectExchange exchange, Queue queue)
{
//Воляочередьи переключитьсяобязательность, И установите ключ, используемый для сопоставления: routerKey
return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
}
}
Подробнее о промежуточном программном обеспечении для сообщений RabbitMQ Серия обучающих статей,Видеть:Промежуточное программное обеспечение сообщений RabbitMQ, эта серия постоянно обновляется.
существовать rabbitmq-provider(элементы отправки сообщений)середина,Создать отправителя,использовать rabbitTemplate.convertAndSend() метод отправки сообщения, код выглядит следующим образом:
package com.pjb;
import com.pjb.config.RabbitMqConfig;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* Тестовый класс RabbitMq
* @author pan_junbiao
**/
@SpringBootTest
public class RabbitMqTest
{
@Autowired
RabbitTemplate rabbitTemplate;
@Test
public void sendMessage()
{
String message = «Здравствуйте, добро пожаловать в гости pan_junbiaoизблог";
rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_NAME, RabbitMqConfig.ROUTING_KEY, message);
System.out.println("Сообщение отправлено успешно!");
}
}
В файле информации конфигурации pom.xml добавьте соответствующие файлы зависимостей:
<!-- AMQP-клиент -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.4.1</version>
</dependency>
существовать application.yml Настроить в файле конфигурации RabbitMQ Сервис, его нужно настроить здесь RabbitMQ Механизм повтора:
spring:
# Название проекта
application:
name: rabbitmq-consumer
# RabbitMQСлужить Конфигурация rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
listener:
simple:
# Механизм повтора
retry:
enabled: true #Включить ли повторную попытку потребителя
max-attempts: 5 #Максимальное количество повторов
initial-interval: 5000ms #Интервал повтора (единица миллисекунды)
max-interval: 1200000ms #Максимальный интервал повтора (в миллисекундах)
multiplier: 2 #Множитель интервала времени, интервал времени * множитель = следующий из интервала времени, максимум не может превышать установленный из максимального интервала времени
существовать rabbitmq-consumer(Проект получения сообщений)середина,создавать Создать получателя, внимания, отправителя и получателя из Queue Имена должны совпадать, иначе сообщение невозможно будет получить.
После того как получатель получает сообщение, он распечатывает его, а затем программа выдает исключение во время выполнения и наблюдает за явлением. Код выглядит следующим образом:
package com.pjb.receiver;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* получатель
* @author pan_junbiao
**/
@Component
@RabbitListener(queues="queue_name")
public class Receiver
{
@RabbitHandler
public void process(String message)
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Получить сообщение: " + message + " Время получения: " + sdf.format(new Date()));
throw new RuntimeException();
}
}
Особое внимание:
Из приведенного выше результата Судя по выполнению, когда принимающая сторона повторит попытку 5 раз, сообщение будет подтверждено (ACK). Подробнее о промежуточном программном обеспечении для сообщений RabbitMQ Серия обучающих статей,Видеть:Промежуточное программное обеспечение сообщений RabbitMQ, эта серия постоянно обновляется.
Справочная статья: https://blog.csdn.net/pan_junbiao/article/details. /113038421 https://blog.csdn.net/feiying0canglang/article/ details/127368401