Channel shutdown: channel error; protocol method

Channel shutdown: channel error; protocol method:

springboot + rabbitMq
场景:使用RabbitTemplate操作mq,使用@RabbitListener申明消费者,并且在方法中手动ACK,发送消息的过程中报如下错误

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)

百度到下面的回答:
百度回答

大致场景是启动springboot时报错;原因是:当应用启动时,spring 会去检查注册的队列,跟服务器上的队列配置是否一致,如果不一致,则抛出这个错误

但是我的并不是启动报错;
原因是使用@RabbitListener注解会自动ACK,如果方法中再手动ACK会造成重复ACK,所以报错
解决:

@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = EXCHANGE_NAME, type = ExchangeTypes.DIRECT),
            key = VERIFICATION_CODE_ROUTE_KEY,
            value = @Queue(value = VERIFICATION_CODE_QUEUE, autoDelete = "false"),
            ignoreDeclarationExceptions = "true"),
            concurrency = "1",
            ackMode = "MANUAL" // 《== 重点
    )

重点是需要设置ackMode属性,该属性是指定ack方式为手动,可以在org.springframework.amqp.core.AcknowledgeMode 枚举类中查看一共有三种方式;
另一种方式是使用 org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer类的方法设置:

//设置消费者ack消息的模式,默认是自动,此处设置为手动
container.setAcknowledgeMode(AcknowledgeMode.MANUAL); 

当然这种方式不是采用注解来实现消费者,主要是要知道注解的原理应该也是通过这样的方式来实现的,这里我没有深究,暂时就到这里。

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值