现在好多项目都需要进行微服务化,所以就需要将传统的ssm项目转化为springboot项目,今天就给大家分享一下:我在RabbitMQ改造时,遇到的坑。
坑一:消息队列无法创建坑:
代码里面明明写了MQ队列如果不存在,就会新建一个消息队列,但是实际却没有任何效果。
1 | @Bean |
如果出现这种情况,检查一下virtualHost是否配置正确,正确配置如下所示:
1 | # rabbitmq配置 |
坑二:延时队列时间无效
延时队列明明设置了30分钟,但是到30分钟却不执行,启动的时候报如下错误:
1 | 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) |
这个坑有两处:
- 一个是设置的延时时间和线上运行的队列时间不相符
- 第二个是设置时间的类型和线上的类型不一致。
1 | @Bean |
x-message-ttl时间是分类型的,一定要设置和线上类型一样才可以,否则就会报错。
坑三:手动ack确认不生效
明明配置了ack手动确定却没生效,如果发现是这种错误,那一定是少配置某项内容,如下所示我们需要配置:
application中配置:
1 | # 开启ACK |
配置类中配置:
1 | connectionFactory中配置如下消息: |
坑四:消费监听线程突然挂掉,导致消息队列堆积
服务状态正常、MQ的连接正常,但是消费线程却挂掉,查看服务出现如下所示的错误:
1 | 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. |
从错误中就可以明显看出来,问题的原因:是因为消费线程在执行的过程中,出现内存溢出,导致线程和MQ断开链接。最终导致消息堆积的出现,只要解决内存溢出的问题即可。
总结:
虽然现在网上的微服务教程一大堆,但是在具体实施的时候还是会遇到各种各样的问题,需要我们一个个解决。这边给大家分享我踩过的坑,希望大家以后遇到可以迅速爬出来。
林老师带你学编程:https://wolzq.com