前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MQ回退消息 springboot

MQ回退消息 springboot

作者头像
一个风轻云淡
发布于 2022-11-13 03:19:42
发布于 2022-11-13 03:19:42
70400
代码可运行
举报
文章被收录于专栏:java学习javajava学习java
运行总次数:0
代码可运行

Mandatory参数

  在仅开启了生产者确认机制的情况下,交换机接收到消息后,会直接给消息生产者发送确认消息,如果发现该消息不可路由,那么消息会被直接丢弃,此时生产者是不知道消息被丢弃这个事件的。那么如何让无法被路由的消息帮我想办法处理一下?最起码通知我一声,我好自己处理啊。通过设置mandatory参数可以在当消息传递过程中不可达目的地时将消息返回给生产者。  

 消息生产者:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@RestController
public class MessageProduce implements RabbitTemplate.ConfirmCallback ,RabbitTemplate.ReturnCallback{
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @PostConstruct
    private  void init()
    {
        rabbitTemplate.setConfirmCallback(this);
        /**
         * true:
         *       交换机无法将消息进行路由的时候,会将该消息返回给生产者
         * false:
         *       如果发现消息无法进行路由,则直接将消息扔掉
         */
        rabbitTemplate.setMandatory(true);
        //将回退消息交给谁处理
        rabbitTemplate.setReturnCallback(this);
    }
    @GetMapping("sendMessage/{message}")
    public void sendMessage(@PathVariable String message)
    {
        //让消息绑定一个id值
        CorrelationData correlationData1 = new CorrelationData(UUID.randomUUID().toString());
        rabbitTemplate.convertAndSend("confirm.exchange","key1",message+"key1",correlationData1);
        rabbitTemplate.convertAndSend("confirm.exchange","key2",message+"key2",correlationData1);
        log.info("发送消息id位{}内容为{}",correlationData1.getId(),message+"key1");
        log.info("发送消息id位{}内容为{}",correlationData1.getId(),message+"key2");

    }
    @Override
    public void confirm(CorrelationData correlationData, boolean b, String s) {
        String id= correlationData!=null?correlationData.getId():"";
        if(b)
        {
            log.info("交换机收到消息确认成功;id{}",id);
        }
        else {
            log.error("消息id{}未成功投递到交换机,原因是:{}",id,s);
        }
    }

    @Override
    public void returnedMessage(Message message, int replyCode, String replyText,
                                String exchange, String routingKey)  {
            log.info("消息:{}被服务器退回,退回的原因是{},交换机是{}",
                    new String(message.getBody()),replyText,exchange,routingKey);
    }
}

回调接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
@Slf4j
public class MyCallBack implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnCallback {
    @Override
    public void confirm(CorrelationData correlationData, boolean ack ,String cause) {
        String id=correlationData!=null?correlationData.getId():"";
        if(ack)
        {
            log.info("交换机已经收到id为{}的消息",id);
        }
        else
        {
            log.info("交换机还未收到id未:{}的消息,原因是{}",cause);
        }
    }

    @Override
    public void returnedMessage(Message message, int replyCode, String replyText,
                                String exchange, String routingKey) {
        log.error("消息{},被交换机{}退回。退回的原因是:{},路由key为{}",new String(message.getBody()),
                exchange,replyText,routingKey);
    }
}

消费者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
@Slf4j
public class ConfirmConsumer {
    public static  final  String CONFIRM_QUEUE_NAME="confirm.queue";
    @RabbitListener(queues = CONFIRM_QUEUE_NAME)
    public void receiveMsg(Message message)
    {
        String s = new String(message.getBody());
        log.info("接收到队列confirm.queue消息:{}",s);
    }
}

http://localhost:8989/sendMessage/8888

结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RibbitMQ学习笔记之发布确认高级
在生产环境中由于一些不明原因,导致 rabbitmq 重启,在 RabbitMQ 重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投递呢? 特别是在这样比较极端的情况,RabbitMQ 集群不可用的时候,无法投递的消息该如何处理呢:
默 语
2024/11/20
1060
RibbitMQ学习笔记之发布确认高级
RabbitMQ之发布确认高级
  在生产环境中由于一些不明原因,导致 rabbitmq 重启,在 RabbitMQ 重启期间生产者消息投递失败, 导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投递呢? 特别是在这样比较极端的情况,RabbitMQ 集群不可用的时候,无法投递的消息该如何处理呢:
别团等shy哥发育
2023/02/25
5820
RabbitMQ之发布确认高级
【RabbitMQ】如何进行消息可靠投递【下篇】
上一篇文章里,我们了解了如何保证消息被可靠投递到RabbitMQ的交换机中,但还有一些不完美的地方,试想一下,如果向RabbitMQ服务器发送一条消息,服务器确实也接收到了这条消息,于是给你返回了ACK确认消息,但服务器拿到这条消息一看,找不到路由它的队列,于是就把它丢进了垃圾桶,emmm,我猜应该属于可回收垃圾。
弗兰克的猫
2019/09/29
5030
【RabbitMQ】如何进行消息可靠投递【下篇】
RabbitMQ 发布确认高级
在生产环境中由于一些不明原因,导致 RabbitMQ 重启,在 RabbitMQ 重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投递呢?
用户9615083
2022/12/25
8580
RabbitMQ 发布确认高级
MQ备份交换机springboot
有了 mandatory 参数和回退消息,我们获得了对无法投递消息的感知能力,有机会在生产者的消息无法被投递时发现并处理。
一个风轻云淡
2022/11/13
1770
MQ备份交换机springboot
RabbitMQ之发布高级
首先发布消息后进行备份在缓存里,如果消息成功发布确认到交换机,则从缓存里删除该消息,如果没有成功发布,则设置一个定时任务,重新从缓存里获取消息发布到交换机,直到成功发布到交换机。
shaoshaossm
2022/12/27
2340
RabbitMQ之发布高级
MQ发布确认springboot版本
spring.rabbitmq.publisher-confirm-type=correlated
一个风轻云淡
2022/11/13
4180
MQ发布确认springboot版本
RabbitMQ---延迟队列,整合springboot
延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。
大忽悠爱学习
2021/12/07
6800
RabbitMQ---延迟队列,整合springboot
SpringBoot系列之RabbitMQ可靠性投递实践教程
基于SpringBoot 2.2.1.RELEASE集成RabbitMQ的可靠性投递实践,以下是一个详细的测试例子,包括如何配置、发送消息、接收消息,并验证消息的可靠性投递。
SmileNicky
2025/05/02
1740
SpringBoot系列之RabbitMQ可靠性投递实践教程
RabbitMQ之备份交换机
  有了 mandatory 参数和回退消息,我们获得了对无法投递消息的感知能力,有机会在生产者的消息 无法被投递时发现并处理。但有时候,我们并不知道该如何处理这些无法路由的消息,最多打个日志,然 后触发报警,再来手动处理。而通过日志来处理这些无法路由的消息是很不优雅的做法,特别是当生产者 所在的服务有多台机器的时候,手动复制日志会更加麻烦而且容易出错。而且设置 mandatory 参数会增 加生产者的复杂性,需要添加处理这些被退回的消息的逻辑。如果既不想丢失消息,又不想增加生产者的 复杂性,该怎么做呢?前面在设置死信队列的文章中,我们提到,可以为队列设置死信交换机来存储那些 处理失败的消息,可是这些不可路由消息根本没有机会进入到队列,因此无法使用死信队列来保存消息。 在 RabbitMQ 中,有一种备份交换机的机制存在,可以很好的应对这个问题。
别团等shy哥发育
2023/02/25
4340
RabbitMQ之备份交换机
springboot + rabbitmq 用了消息确认机制,感觉掉坑里了
最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷KPI。不过,话说回来这的确是件好事,与其开那些没味的扯皮会,多做技术交流还是很有助于个人成长的。
程序员小富
2020/07/01
7840
springboot + rabbitmq 用了消息确认机制,感觉掉坑里了
2、MQ配置以及生产者消费者逻辑
用户10136162
2023/10/30
1800
RabbitMQ如何保证消息不丢失?
用户10136162
2023/10/30
3090
RabbitMQ如何保证消息的可靠投递?
github地址: https://github.com/erlieStar/rabbitmq-examples
Java识堂
2020/10/23
6030
RabbitMQ高级特性之延迟队列
很多时候我们想定时去做某件事情的时候我们会首先想到定时任务,quartz是个不错的选择,但是也有缺点,假如配置在项目中,集群部署会有重复执行的问题,如果持久化在mysql中,解决了集群的问题,但是过于依赖mysql,耦合严重,当然还有日志量庞大、执行时间精度、过于耗费系统资源等等问题。所以这时候使用消息队列中间件的的延时队列就是一个很好得解决方案,我们设置要触发消费的时间和必要的参数入队mq,到时监听queue的消费者自然拿到消息然后去走业务流程,这里介绍的是基于rabbitmq中间件实现的TTL版的延时队列。
黎明大大
2021/03/25
1.2K0
RabbitMQ高级特性之延迟队列
SpringBoot-RabbitMQ发送消息的监控
刚才我们发送消息,不管成功还是失败,都不报错,结果看效果时,发现有的没有发进去,那么如何知道消息是否发送成功呢,RabbitMQ提供了一个消费监视的功能。注意:RabbitMQ发送消息分为2个阶段,消息发送到交互机里面,可以监视,消息由交互机到队列里面,也可以监视。
程序员NEO
2023/09/27
3360
SpringBoot-RabbitMQ发送消息的监控
RabbitMQ架构面试题答不出来怎么办!大佬手绘架构图带你分分钟搞懂!
1、削峰:在某个模块接收到超过最大承受的并发量时,可以通过 MQ 排队来使这些削减同一时刻处理的消息量。减小并发量。
Java程序猿
2021/07/15
6330
RabbitMQ高级特性之消费端限流
假设我们现在有这么一个场景,我们的消费端由于某些原因导致全部宕机等不可用,导致RabbitMQ服务器队列中存储了大量消息未被消费掉,那么等恢复消费端服务器后,就会有巨大量的消息全部推送过来,但是我们单个客户端无法同事处理这么多消息,就是导致消费端一些不可预测错误,甚至又会重复发生宕机,所以在实际业务场景中,限流保护还是非常重要的。
黎明大大
2021/03/08
7900
RabbitMQ生产端消息可靠性投递方案分析
导文: 1.什么是RabbitMQ 2.Java开发技术大杂烩(三)之电商项目优化、rabbitmq、Git、OSI、VIM、Intellj IDEA、HTTP、JS、Java
用户2032165
2018/12/07
1.8K0
SpringBoot 整合 RabbitMQ 实现消息可靠传输
生产阶段通过请求确认机制,来确保消息的可靠传输。当发送消息到 RabbitMQ 服务器 之后,RabbitMQ 收到消息之后,给发送返回一个请求确认,表示RabbitMQ 服务器已成功的接收到了消息。
用户10384376
2023/02/26
3870
SpringBoot 整合 RabbitMQ 实现消息可靠传输
相关推荐
RibbitMQ学习笔记之发布确认高级
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验