rabbitMq消息重复发送,重复ack原因

故事

这两天一直在做毕业设计,在搭建项目框架的时候遇到了rabbitMq相关的东西,然后之前自己有大致学习过,现在全部忘记的一干二净,然后就是基础不牢地动山摇,好好打基础吧

程序报错

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)

大概就是说,Channel这玩意已经关闭了,没了,为什么没了呢,开始我也一直想不明白,我明明在yml文件中配置了手动ack,yml像这样。

pring:
  rabbitmq:
    addresses: xxx.xxx.xxx.xxx:xxxx
    username: admin
    password: admin
    publisher-confirms: true
    publisher-returns: true
    #默认虚拟主机
    virtual-host: /
    #连接超时实践
    connection-timeout: 10000
    publisher-confirm-type: correlated
    template:
      mandatory: true
      retry:
        max-attempts: 5 #最大重试次数
        max-interval: 10000 #最大重试时间
    #消费端配置
    listener:
      type: direct
      direct:
        max-concurrency: 50
        concurrency: 10
        acknowledge-mode: manual #签收设置
        retry:
          enabled: true
          initial-interval: 50000
        prefetch: 1 #限流

然后百度了很多,emmmm全是复制粘贴,关键是还解决不了我的问题。造成这个错误会有啥结果呢?

错误结果

生产者所投递的消息,虽然只是投递了一次,但是消费者会进行两次或者多次应答,然后造成消息被被两次以上重复投递

错误原因

进行多次ack,重复ack所造成

出现原因

应为在rabbitmqConf中使用了序列化设置,造成了设置manual失效。原来的配置类如下:

出现错误的配置类

@Configuration
public class RabbitMqConfig implements RabbitListenerConfigurer {

    ...
  
	...

    @Override
    public void configureRabbitListeners(RabbitListenerEndpointRegistrar rabbitListenerEndpointRegistrar) {
        rabbitListenerEndpointRegistrar.setMessageHandlerMethodFactory(messageHandlerMethodFactory());
    }

    @Bean
    MessageHandlerMethodFactory messageHandlerMethodFactory(){
        DefaultMessageHandlerMethodFactory messageHandlerMethodFactory = new DefaultMessageHandlerMethodFactory();
        messageHandlerMethodFactory.setMessageConverter(mappingJackson2MessageConverter());
        return messageHandlerMethodFactory;
    }

    @Bean
    public MappingJackson2MessageConverter mappingJackson2MessageConverter(){
        return  new MappingJackson2MessageConverter();

处理

在配置类的SimpleRabbitListenerContainerFactory中增加

 factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);

到此问题得以解决。修改后的配置文件为


/**
 * @author WangShilei
 * @date 2020/11/13-13:34
 **/
@Configuration
@Slf4j
public class RabbitMqConfig {

   ...
	...

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setMessageConverter(messageConverter);
        return template;
    }


    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(messageConverter);
        return factory;
    }

    @Bean
    public MessageConverter messageConverter() {
        return new ContentTypeDelegatingMessageConverter(new Jackson2JsonMessageConverter());
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sirwsl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值