RabbitMQ学习笔记:addReturnListener监听回退消息

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

 

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

发布消息示例
    channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, true, false, properties.build(), message.getBytes());

参数:

  • mandatory:如果为true, 消息不能路由到指定的队列时,则会调用basic.return方法将消息返回给生产者,会触发addReturnListener注册的监听器;如果为false,则broker会直接将消息丢弃
  • immediate:如果为true,当exchange将消息路由到queue时发现queue上没有消费者,那么这条消息不会放入队列中,该消息会通过basic.return方法返还给生产者。

在RabbitMQ3.0以后的版本里去掉了immediate参数的支持,发送带immediate=true的publish会返回如下错误, com.rabbitmq.client.AlreadyClosedException: connection is already closed due to connection error; protocol method: #method<connection.close>(reply-code=540, reply-text=NOT_IMPLEMENTED - immediate=true, class-id=60, method-id=40)

为什么会取消immediate参数支持,immediate标记会影响镜像队列性能,增加代码复杂性,并建议采用TTL和DLX等方式代替

生产者接收退回的消息

提供了两个接收回退消息的监听器方法,实现的方式基本一样,第二个更简洁一些,推荐使用第二种方法:

    void addReturnListener(ReturnListener listener)
    ReturnListener addReturnListener(ReturnCallback returnCallback)

第一种方案示例:

    channel.addReturnListener((replyCode, replyText, exchange, routingKey, properties, body) -> {
                    System.out.println("第一个监听器执行了---");
                });

第二种方案示例(是不是很简介):

                channel.addReturnListener((returnMessage)-> {
                    System.out.println("第二个监听器执行了---");
                });
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值