当前位置: 首页 > news >正文

Spring Boot 集成 RabbitMQ 并实现消息确认机制

1. 引言

在 Spring Boot 项目中,RabbitMQ 是一种常见的消息中间件,用于实现异步通信。为了确保消息可靠传输,我们需要配置 RabbitTemplate,并实现 ConfirmCallbackReturnsCallback 两种回调机制。

本文将介绍如何在 Spring Boot 中

2. RabbitMQ 配置类

首先,我们创建 RabbitMqConfig 配置类:

集成 RabbitMQ,并详细讲解 RabbitTemplate 的使用。

@EnableRabbit
@Configuration
public class RabbitMqConfig {

    private static Logger log = LoggerFactory.getLogger(RabbitMqConfig.class);

    @Bean
    RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate();
        rabbitTemplate.setConnectionFactory(connectionFactory);
        
        // 必须设置为 true,否则消息投递失败不会触发 ReturnCallback
        rabbitTemplate.setMandatory(true);

        // 消息发送确认回调
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
            String messageId = correlationData != null ? correlationData.getId() : "null";
            if (ack) {
                log.info("消息成功发送到交换机,消息ID:{}", messageId);
            } else {
                log.error("消息发送到交换机失败,消息ID:{},原因:{}", messageId, cause);
            }
        });

        // 消息路由失败回调
        rabbitTemplate.setReturnsCallback(returned -> {
            String correlationId = returned.getMessage().getMessageProperties()
                    .getHeader("spring_returned_message_correlation");
            log.error("消息发送失败,ID:{},应答码:{},原因:{},交换机:{},路由键:{}",
                    correlationId, returned.getReplyCode(), returned.getReplyText(),
                    returned.getExchange(), returned.getRoutingKey());
        });
        
        return rabbitTemplate;
    }
}

3. 消息投递的四种情况

在使用 RabbitMQ 时,消息投递可能遇到以下四种情况:

  1. 消息推送到 RabbitMQ 服务器,但找不到交换机

    • ConfirmCallback 被触发,ack = false

  2. 消息推送到服务器,找到交换机,但找不到队列

    • ConfirmCallback 被触发,ack = true

    • ReturnsCallback 也会被触发

  3. 消息推送到服务器,既找不到交换机,也找不到队列

    • ConfirmCallback 被触发,ack = false

  4. 消息推送成功

    • ConfirmCallback 被触发,ack = true


4. 发送消息示例

@Autowired
private RabbitTemplate rabbitTemplate;

public void sendMessage(String exchange, String routingKey, String message) {
    CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
    rabbitTemplate.convertAndSend(exchange, routingKey, message, correlationData);
    log.info("发送消息:{},交换机:{},路由键:{},消息ID:{}", message, exchange, routingKey, correlationData.getId());
}

5. 总结

通过 RabbitTemplate 配置 ConfirmCallbackReturnsCallback,我们可以确保消息的可靠投递,并在失败时进行日志记录或重试处理。本文的示例适用于 Spring Boot 2.x 及以上版本,实际使用时可结合具体业务需求进行优化。

希望这篇文章能帮助你更好地理解 RabbitMQ 在 Spring Boot 中的使用!

相关文章:

  • protobuf自动填充字段数据
  • 金融时间序列【量化理论】
  • DHCPV6
  • SOLIDWORKS无法卸载解决方法 - 强制卸载程序
  • 淘宝关键词搜索API接口系列,json数据示例参考
  • 【ST-LINK未能被keil识别STM32 ST-LINK Utility出现“Can not connect to target】
  • 用 PyMuPDF 和 Pillow 打造 PDF 超级工具
  • 自动驾驶之BEV概述
  • tidb实时同步到mysql
  • 多模态论文笔记——TECO
  • OpenCV二值化处理
  • 上位机知识篇---Docker容器
  • 用AI学历史1——中国通史
  • Python pathlib模块介绍
  • 【面试】Redis 常见面试题
  • 专利申请流程详解:从创意到授权的完整指南
  • Nginx 负载均衡详解
  • 在UBUNTU下搭建Deepseek
  • 力扣hot100——螺旋矩阵 超简单易懂的模拟搜索方法
  • 专题--Redis
  • 2025年“投资新余•上海行”钢铁产业“双招双引”推介会成功举行
  • 科学家为AI模型设置“防火墙”,以防止被不法分子滥用
  • 国有六大行一季度合计净赚超3444亿,不良贷款余额均上升
  • 这座“蚌埠住了”的城市不仅会接流量,也在努力成为文旅实力派
  • 杭州银行一季度净赚超60亿增逾17%,增速较去年同期有所回落
  • 伊朗港口爆炸已致46人死亡