前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RabbitMQ日常爬坑分享

RabbitMQ日常爬坑分享

作者头像
林老师带你学编程
发布2019-07-02 10:27:34
2.1K0
发布2019-07-02 10:27:34
举报
文章被收录于专栏:强仔仔强仔仔

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1454196

现在好多项目都需要进行微服务化,所以就需要将传统的ssm项目转化为springboot项目,今天就给大家分享一下:我在RabbitMQ改造时,遇到的坑。

坑一:消息队列无法创建坑:

代码里面明明写了MQ队列如果不存在,就会新建一个消息队列,但是实际却没有任何效果。

    @Bean
    public Queue amzRealTimeOrderSuccess() {
        Queue amzRealTimeOrderSuccess = new Queue("amz_RealTimeOrder:success", true, false, false);
        return amzRealTimeOrderSuccess;
    }

如果出现这种情况,检查一下virtualHost是否配置正确,正确配置如下所示:

#  rabbitmq配置
  rabbitmq:
    host: 192.168.0.10
    port: 5672
    username: test
    password: 123456
    virtual-host: /

坑二:延时队列时间无效

延时队列明明设置了30分钟,但是到30分钟却不执行,启动的时候报如下错误:

Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'x-message-ttl' for queue 'amz_advertisement:request_delay' in vhost '/': received '60000' but current is '60000', class-id=50, method-id=10)

这个坑有两处:

  • 一个是设置的延时时间和线上运行的队列时间不相符
  • 第二个是设置时间的类型和线上的类型不一致。
 @Bean
    public Queue amzAdvertisementReportDelay() {
        Map<String, Object> params = new HashMap<>();
        params.put("x-message-ttl", new Long(60000));
        params.put("x-dead-letter-exchange", "amz_advertisement:exchange_delay");
        params.put("x-dead-letter-routing-key", "amz_advertisement:report");
        Queue amzAdvertisementReportDelay = new Queue("amz_advertisement:report_delay", true, false, false, params);
        return amzAdvertisementReportDelay;
    }

x-message-ttl时间是分类型的,一定要设置和线上类型一样才可以,否则就会报错。

坑三:手动ack确认不生效

明明配置了ack手动确定却没生效,如果发现是这种错误,那一定是少配置某项内容,如下所示我们需要配置:

application中配置:

    # 开启ACK
    listener:
      simple:
       acknowledge-mode: manual
      direct:
        acknowledge-mode: manual

配置类中配置:

connectionFactory中配置如下消息:
// 设置消息发布确认机制
connectionFactory.setPublisherConfirms(true);
connectionFactory.setPublisherReturns(true);
        
RabbitTemplate中设置如下配置:
// 消息确定回调函数
template.setConfirmCallback(confirmCallBackListener);
template.setReturnCallback(returnCallBackListener);

坑四:消费监听线程突然挂掉,导致消息队列堆积

服务状态正常、MQ的连接正常,但是消费线程却挂掉,查看服务出现如下所示的错误:

 xxl-job-executor-sample-spring [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer]-[org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-14]-[run]-[1524]-[ERROR] Consumer thread error, thread abort.
java.lang.OutOfMemoryError: Java heap space

从错误中就可以明显看出来,问题的原因:是因为消费线程在执行的过程中,出现内存溢出,导致线程和MQ断开链接。最终导致消息堆积的出现,只要解决内存溢出的问题即可。

总结:

虽然现在网上的微服务教程一大堆,但是在具体实施的时候还是会遇到各种各样的问题,需要我们一个个解决。这边给大家分享我踩过的坑,希望大家以后遇到可以迅速爬出来。

林老师带你学编程https://wolzq.com

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档