(16)RabbitMQ与Spring、SpringBoot整合时的坑及注意点

一:消费者报错

消费者出现ERROR日志:Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)

出现这个错误的原因是因为消费者没有配置消息签收模式,我们可以添加acknowledge配置即可:

用Spring时的配置

<rabbit:listener-container connection-factory="connectionFactory" acknowledge="manual">

 用SpringBoot时的配置

spring.rabbitmq.listener.simple.acknowledge-mode=manual

二:生产者报错

生产者报错:Only one ConfirmCallback is supported by each RabbitTemplate

出现这个的原因是因为RabbitTemplate是单例的,而setConfirmCallback(confirmCallBack)方法只能调用一次。

解决办法有两个:1、创建单例的RabbitTemplate并设置confirm回调,这样所有使用该RabbitTemplate发消息时都会触发confirm;2:将RabbitTemplate改为多例的,每次发送消息获取新的bean,具体解决办法详见上节《(15)RabbitMQ与SpringBoot的整合使用》

三:消费者一直循环重复消费消息

消费者消息签收模式为自动时,如果消费端处理出现异常并且被抛出了,该条消息就会一直被重新消费,并且会看到如下的异常:

ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'public void com.wkp.springboot.consumer.ConsumerRabbitConfig.comsumeB(org.springframework.messaging.Message,com.rabbitmq.client.Channel) throws java.io.IOException' threw exception

这是因为在消费时抛出异常,消息被消费者拒绝了,而且默认的requeue参数为true,即默认会重回队列,重回队列之后又投递到消费者,然后又报错抛出异常重回队列。。。。。。导致该条消息一直被循环重复消费。

解决办法:可以将requeue设为false

用Spring时的配置

 <rabbit:listener-container connection-factory="connectionFactory" requeue-rejected="true">
       <rabbit:listener ref="consumerHandler" queue-names="spring_myqueue"/>
 </rabbit:listener-container>

用SpringBoot时的配置

spring.rabbitmq.listener.simple.default-requeue-rejected=false

另外,在自动签收模式下,如果消费者抛出异常,我们还可以通过 spring.rabbitmq.listener.simple.retry.enabled=true 开启消息重新投递,设置最多投递次数(retry.max-attempts默认为3)和投递时间间隔(retry.initial-interval默认1000ms),配置如下:在消息达到最大重新投递次数之后,根据requeue来决定是重回队列还是丢弃消息。

#设置签收模式为手动签收,并行消费数量,最大并行消费数量
spring.rabbitmq.listener.simple.acknowledge-mode=auto

# 一般消费者自动签收模式下可以添加下面配置,用于消费抛出异常后进行消息重新投递设置
#是否开启消费者重试(为false时关闭消费者重试)
spring.rabbitmq.listener.simple.retry.enabled=true
# 最大重试重新投递消息次数
spring.rabbitmq.listener.simple.retry.max-attempts=3
#重试重新投递消息间隔时间(单位毫秒)
spring.rabbitmq.listener.simple.retry.initial-interval=5000ms
#重试次数超过上面的设置之后是否丢弃(消费者listener抛出异常,是否重回队列,默认true:重回队列, false为不重回队列(结合死信交换机))
spring.rabbitmq.listener.simple.default-requeue-rejected=false

踩坑的路上。。。。。。。。。

未完待续。。。。。。。。。。

 

 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值