rabbitmq进阶:回调函数之确认(confirm)模式、回退(return)模式

本文介绍了Spring框架中RabbitMQ的确认模式(confirm callback)和回退模式(publisher returns),展示了如何在生产者和消费者间实现消息确认,并处理可能的失败情况。通过实例演示了开启确认模式的配置和回调处理,以及回退模式下参数类型不匹配的错误处理。
摘要由CSDN通过智能技术生成

一、确认(confirm)模式

运用场景

当生产者发送消息至交换机后的 成功或失败 所处理的业务

废话不多说,直接上代码

开启确认模式

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    virtual-host: /
    listener:
      simple:
        acknowledge-mode: manual # 消费者手动确认消息
    publisher-confirm-type: correlated # 确认模式 confirm
    @Test
    void contextLoads() {

        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             * @param correlationData 相关配置信息
             * @param ack 交换机是否收到消息
             * @param cause 失败的原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                if (ack) {
                    // TODO 发送成功后的业务逻辑
                    System.out.println("消息发送成功");
                } else {
                    System.out.println("消息发送失败");
                    System.out.println("失败原因" + cause);
                    // TODO 发送失败后的业务处理
                }
            }
        });
        rabbitTemplate.convertAndSend("test.topic", "topic.order", "hello mq");
    }

测试:


二、回退(return)模式

概念

当生产方发送给交换机后,而交换机传递给队列失败时,才会进行相应的业务处理

yml中

spring:
  rabbitmq:
    publisher-returns: true # 回退模式

测试:

建立一个消费者,接受消息的参数类型为Integer

/**
 * @author dugt1998@163.com
 * @date 2020/12/8 14:41
 */
@Component
public class Test {

    @RabbitHandler
    @RabbitListener(queues = "topic.order")
    public void testHandler(Integer integer, Message message, Channel channel) throws IOException {
        System.out.println(integer);
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    }
}

生产者:发送一个String类型的数据,此时消费者会报错,参数类型不匹配 

    @Test
    void contextLoads() {
        rabbitTemplate.setMandatory(true); // 设置强制标志 仅适用于回退模式
        rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
            @Override
            public void returnedMessage(ReturnedMessage returned) {
                System.out.println(returned.getMessage());
            }
        });
        rabbitTemplate.convertAndSend("test.topic", "topic.order", "aa");
    }

结果:NumberFormatException类型转换异常

 

 推荐阅读

      rabbitmq 消息确认机制ACK

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值