13.RabbitMQ 消息可靠性投递confirm确认模式

Posted 九宫格输入法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13.RabbitMQ 消息可靠性投递confirm确认模式相关的知识,希望对你有一定的参考价值。

  在使用RabbitMQ的时候,消息生产者发送消息不希望出现消息丢失或者投递失败的现象;

  RabbitMQ在消息投递可靠性方面给我们提供了两种模式;

    1,confirm确认模式

    2,return 退回模式

confirm确认模式介绍以及实现

  confirm机制,消息的确认,是指生产者投递消息之后,如果Broker收到消息,则会给生产者一个应答,生产者能接收应答,用来确定这条消息是否正常的发送到Broker,这种机制是消息可靠性投递的核心保障。

  confirm机制是只保证消息到达exchange,并不保证消息可以路由到正确的queue,如果exchange错误,就会触发confirm机制在这里插入图片描述
  1、配置文件设置

# 开启confirm模式
spring.rabbitmq.publisher-confirm-type=correlated

  2、com.java996.producer.Service.impl.RabbitMqServiceImpl实现RabbitTemplate.ConfirmCallback接口,实现confirm方法

@Service("RabbitMqService")
public class RabbitMqServiceImpl implements RabbitMqService, RabbitTemplate.ConfirmCallback{

    /**
     *
     * @param correlationData  消息唯一标识
     * @param ack 交换机是否成功收到消息 true成功  false失败
     * @param cause 失败原因
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        System.out.println("confirm方法被执行..."+correlationData.getId());
        if(ack){
            System.out.println("交换机 消息接收成功"+cause);
        }else{
            System.out.println("交换机 消息接收失败"+cause);
            // 这里我们需要做一些消息补发措施
        }
    }
    ......    
}

  3、注入RabbitTemplate模版

@Autowired
private RabbitTemplate rabbitTemplate;

  4、初始化设置

@PostConstruct
public void init(){
    rabbitTemplate.setConfirmCallback(this);
}

  5、发送数据测试

@Override
public void sendMessage(String message) {
    CorrelationData correlationData = new CorrelationData("1");
    rabbitTemplate.convertAndSend(RabbitMqConfig.DIRECT_EXCHANGE,RabbitMqConfig.DIRECT_ROUTINGKEY,message,correlationData);
}

  6、启动测试:

package com.java996.producer;

import com.java996.producer.Service.RabbitMqService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class ProducerApp {
    public static void main(String[] args) {
     ConfigurableApplicationContext context = SpringApplication.run(ProducerApp.class,args);
        RabbitMqService rabbitMqService = (RabbitMqService) context.getBean("RabbitMqService");
        rabbitMqService.sendMessage("confirm确认测试");
    }
}

  7、控制台:
在这里插入图片描述
  8、队列:
在这里插入图片描述

以上是关于13.RabbitMQ 消息可靠性投递confirm确认模式的主要内容,如果未能解决你的问题,请参考以下文章

消息队列专题(高级特性篇):RabbitMQ 如何保证消息的可靠性投递传输和消费

消息队列专题(高级特性篇):RabbitMQ 如何保证消息的可靠性投递传输和消费

消息可靠性投递

RabbitMQ生产方式和解决消息可靠性投递及其他问题

RabbitMQ 可靠投递

SpringBoot+RabbitMQ实现消息可靠性投递