RabbitMQ发送者重连、发送者确认

RabbitMQ发送者重连、发送者确认

一、发送者重连

yaml 复制代码
spring:
  rabbitmq:
    connection-timeout: 1s #设置MQ的连接超时时间
    template:
      retry:
        enabled: true #开启超时重试机制
        initial-interval: 1000ms #失败后的初始等待时间
        multiplier: 1 #失败后下次的等待时长倍数,下次等待时长=initial-interva * multiplier
        max-attempts: 3 #最大重试次数

当网络不稳定的时候,利用重试机制可以有效提高消息发送成功的的成功率,不过SpringAMQP提供的重试机制是阻塞式 的重试,也就是说多次重试等待的过程中,当前线程是被阻塞的,会影响业务性能。

如果对于业务性能有要求,建议禁用 重试机制。如果一定要用,请合理配置等待时长和重试次数,当然也可考虑使用异步线程来执行发送消息的代码。

二、发送者确认

SpringAMQP提供了Publisher ConfirmPublisher Return两种确认机制。开启确认机制以后,当发送者发送消息给MQ后,MQ会返回确认结果给发送者。返回的结果有以下几种情况:

  • 消息投递到MQ,但是路由失败。此时会通过PublisherReturn返回路由异常原因,然后返回ACK,告知投递成功。
  • 临时消息投递到了MQ,并且入队成功,返回ACK,告知投递成功
  • 持久消息投递到了MQ,并且入队完成持久化,返回ACK,告知投递成功
  • 其他情况都会返回NACK,告知投递失败。

1.在publicher这个微服务的application.yml中添加配置

yaml 复制代码
spring:
  rabbitmq:
    publisher-confirm-type: correlated #开启publisher confirm机制,并设置confirm类型
    publisher-returns: true #开启publisher return机制

配置说明这里publisher-confirm-type有三种模式可选

  • none:关闭confirm机制
  • simple:同步阻塞等待MQ的回执消息
  • correlated:MQ异步回调方式返回回执消息

2.ReturnCallback:每个RabbitTemplate只能配置一个ReturnCallback,因此需要在项目启动过程中配置:

java 复制代码
@Slf4j
@Configuration
@RequiredArgsConstructor
public class MqConfig {
    private final RabbitTemplate rabbitTemplate;
    @PostConstruct
    public void init() {
        rabbitTemplate.setReturnsCallback(returnedMessage -> {
            log.error("监听到消息return callback");
            log.debug("exchange: {}", returnedMessage.getExchange());
            log.debug("routingKey: {}", returnedMessage.getRoutingKey());
            log.debug("message: {}", returnedMessage.getMessage());
            log.debug("replyCode: {}", returnedMessage.getReplyCode());
            log.debug("replyText: {}", returnedMessage.getReplyText());
        });
    }
==============================上面简化的是这部分内容=========================================================

   rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
       @Override
       public void returnedMessage(ReturnedMessage returnedMessage) {
           //TODO
       }
   });

3.ConfirmCallback:发送消息,指定消息ID,消息ConfirmCallback

java 复制代码
@Test
    public void testConfirmCallback() throws InterruptedException {
        //创建correlationData
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        correlationData.getFuture().addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {
            @Override
            public void onFailure(Throwable ex) {
                log.error("spring amqp 处理确认结果异常", ex);
            }
            @Override
            public void onSuccess(CorrelationData.Confirm result) {
                if (result.isAck()) {
                    log.debug("收到ConfirmCallback ack,消息发送成功!!!");
                } else {
                    log.error("收到ConfirmCallback nack,消息发送失败!reason:{}", result.getReason());
                }
            }
        });
        //交换机名称
        String exChangeNange = "hmall.topic";
        //消息
        String message = "TopicTopic!!!Topic!!! ";
        //发送消息
        rabbitTemplate.convertAndSend(exChangeNange, "hina.new", message, correlationData);
        Thread.sleep(3000);
    }
相关推荐
Wang's Blog2 小时前
RabbitMQ: 声明式配置简化管理
分布式·rabbitmq
爱学大树锯2 小时前
在Docker环境中安装RabbitMQ延迟消息插件实战记录
docker·容器·rabbitmq
Henry_Wu0013 小时前
go与c# 及nats和rabbitmq交互
golang·c#·rabbitmq·grpc·nats
21995 小时前
消息中间件2025技术全景与选型指南
中间件·开源·rabbitmq
白露与泡影6 小时前
RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费?
分布式·rabbitmq
武子康6 小时前
Java-200 RabbitMQ 架构与 Exchange 路由:fanout/direct/topic/headers
java·架构·消息队列·系统架构·rabbitmq·java-rabbitmq·mq
ysy16480672396 小时前
RabbbitMQ入门:从Windows版本RabbitMQ安装到Spring AMQP实战(一)
windows·rabbitmq·java-rabbitmq
武子康1 天前
Java-199 JMS Queue/Topic 集群下如何避免重复消费:ActiveMQ 虚拟主题与交付语义梳理
java·分布式·消息队列·rabbitmq·activemq·mq·java-activemq
Wang's Blog1 天前
RabbitMQ: 消息过期机制与死信队列技术解析
rabbitmq
苦学编程的谢1 天前
RabbitMQ_7_高级特性(4)
分布式·rabbitmq