SpringBoot整合RabbitMQ发布确认高级

在Spring Boot整合RabbitMQ时,启用发布确认(Publisher Confirmations)功能可以提高消息发送的可靠性。以下是如何在Spring Boot中启用并使用发布确认的高级特性:

1. 配置发布确认类型

application.propertiesapplication.yml 中配置 RabbitMQ 的发布确认模式为 correlatedsimple

spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true # 如果需要启用返回未路由的消息确认
spring.rabbitmq.publisher-confirm-type=correlated # 或者 simple

2. 在RabbitTemplate上启用和处理确认回调

为了能够接收到RabbitMQ Broker对发布的每条消息的确认反馈,你需要创建一个自定义的RabbitTemplate bean,并注册一个回调处理器。

@Configuration
public class RabbitConfig {

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        final RabbitTemplate template = new RabbitTemplate(connectionFactory);
        // 开启发布确认
        template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                if (ack) {
                    System.out.println("Message with id " + correlationData.getId() + " was successfully published.");
                } else {
                    System.out.println("Message with id " + correlationData.getId() + " was NOT published due to: " + cause);
                }
            }
        });

        // 如果你还需要处理未路由的消息,则开启返回回调
        template.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                System.out.println("Message returned from broker: " + message.getMessageProperties().getMessageId());
                // 分析原因并进行相应的处理
            }
        });

        return template;
    }

    // 其他队列、交换机和绑定的相关配置...
}

3. 发送带有CorrelationData的消息

在发送消息时,可以提供一个CorrelationData对象来跟踪消息的确认情况:

@Autowired
private RabbitTemplate rabbitTemplate;

public void sendMessage(String message) {
    CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
    rabbitTemplate.convertAndSend("myExchange", "routingKey", message, correlationData);
}

现在,每当向RabbitMQ发送一条消息后,都会触发ConfirmCallback中的confirm()方法,根据ack参数确定消息是否成功投递到至少一个队列中。如果设置了publisher-returns并且消息没有被任何队列消费,那么还会触发ReturnCallback中的returnedMessage()方法。

通过这种方式,您可以确保对每一个发出的消息都有明确的成功或失败反馈,从而实现更可靠的消息传递机制。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值