springBoot整合RabbitMq实现手动确认消息

如何保证消息的可靠性投递?

1.保证生产者向broke可靠性投递,开启ack投递成功确认,如果失败的话进行消息补偿

java 复制代码
/**
 * @author yueF_L
 * @date 2023-08-10 01:32
 * ConfirmCallback:消息只要被 RabbitMQ broker 接收到就会触发confirm方法。
 */
@Slf4j
@Component
public class ConfirmCallbackService implements RabbitTemplate.ConfirmCallback {

  
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (!ack) {
            log.error("confirm==>发送到broker失败\r\n" +
                            "correlationData={}\r\n" + "ack={}\r\n" + "cause={}",
                    correlationData, ack, cause);
        } else {
            log.info("confirm==>发送到broker成功\r\n" +
                            "correlationData={}\r\n" + "ack={}\r\n" + "cause={}",
                    correlationData, ack, cause);
        }
    }
  1. 保证消息能投敌到目标 queue
java 复制代码
/**
 * @author yueF_L
 * @date 2023-08-10 01:29
 * ReturnCallback:如果消息未能投递到目标 queue 里将触发returnedMessage方法。
 * 若向 queue 投递消息未成功,可记录下当前消息的详细投递数据,方便后续做重发或者补偿等操作。
 */
@Slf4j
@Component
public class ReturnCallbackService implements RabbitTemplate.ReturnCallback {


    @Override
    public void returnedMessage(Message message, int replyCode, String replyText,
                                String exchange, String routingKey) {
        log.info("returnedMessage==> \r\n" + "message={}\r\n" + "replyCode={}\r\n" +
                        "replyText={}\r\n" + "exchange={}\r\n" + "routingKey={}",
                message, replyCode, replyText, exchange, routingKey);
    }
}

将配置set到rabbitTemplate

java 复制代码
/**
 * @author yueF_L
 * @date 2023-08-10 01:25
 * 消息队列配置
 */
@Slf4j
@Configuration
@RequiredArgsConstructor
public class RabbitMQConfig {

    private final ConfirmCallbackService confirmCallbackService;

    private final ReturnCallbackService returnCallbackService;

    @Bean
    RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        // 开启失败通知
        rabbitTemplate.setMandatory(true);
        rabbitTemplate.setConfirmCallback(confirmCallbackService);
        rabbitTemplate.setReturnCallback(returnCallbackService);
        return rabbitTemplate;
    }
}

yml配置

代码中的调用

java 复制代码
  @RabbitListener(queues = TtlQueueConfig.DEAD_LETTER_QUEUE_TELEPHONE_BILL)
    public void receiveD(Message message, Channel channel) {
        try {
            try {
                String msg = new String(message.getBody());
                // 模拟异常,测试重试
                int a = 1 / 0;
                //apiService.doApiHeartChainTelephoneBillOrder(msg);
                // 手动确认消息
                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
                log.info("当前时间:{},收到话费死信队列信息:{}", new Date(), msg);
            }catch (Exception e){
                //参数1:消费消息的index
                //参数2:是否批量否定多个消息,设为false就与basicReject功能一样,triue的前提也是在同一个channel,且在该消息否定前存在未确认的消息
                //参数3: 对异常消息的处理,true表示重排序,false表示丢弃
                // 如果拒绝消息,要求mq重发的话,一直异常会进入死循环
                //channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
                log.error(TtlQueueConfig.DEAD_LETTER_QUEUE_TELEPHONE_BILL + " 消息反馈失败,param:{}", message.getBody());
                throw e;
            }
        } catch (Exception e) {
            log.error("监听RabbitMq、队列:" + TtlQueueConfig.DEAD_LETTER_QUEUE_TELEPHONE_BILL + "发生异常:"+ e.getMessage());
            throw new CustomException("监听RabbitMq、队列:" + TtlQueueConfig.DEAD_LETTER_QUEUE_TELEPHONE_BILL + "发生异常:"+ e.getMessage());
        }
    }
相关推荐
小林想被监督学习2 小时前
RabbitMQ 的7种工作模式
分布式·rabbitmq
黑胡子大叔的小屋4 小时前
基于springboot的海洋知识服务平台的设计与实现
java·spring boot·毕业设计
计算机毕设孵化场5 小时前
计算机毕设-基于springboot的校园社交平台的设计与实现(附源码+lw+ppt+开题报告)
spring boot·课程设计·计算机毕设论文·计算机毕设ppt·计算机毕业设计选题推荐·计算机选题推荐·校园社交平台
苹果醋36 小时前
Golang的文件加密工具
运维·vue.js·spring boot·nginx·课程设计
小马爱打代码7 小时前
Spring Boot 中 Map 的最佳实践
java·spring boot·spring
全栈开发帅帅8 小时前
基于springboot+vue实现的博物馆游客预约系统 (源码+L文+ppt)4-127
java·spring boot·后端
m0_748255658 小时前
Springboot基于Web的景区疫情预警系统设计与实现5170q(程序+源码+数据库+调试部署+开发环境)
前端·数据库·spring boot
平行线也会相交9 小时前
云图库平台(三)——后端用户模块开发
数据库·spring boot·mysql·云图库平台
lxyzcm10 小时前
深入理解C++23的Deducing this特性(上):基础概念与语法详解
开发语言·c++·spring boot·设计模式·c++23
wy02_10 小时前
Linux下载RabbitMQ,并解决Github拒绝访问443的问题
linux·rabbitmq·github