_YuLF 2021-02-19 21:04 采纳率: 66.7%
浏览 257
已结题

Rabbitmq-SpringBoot 配置类开启手动签收消息

在yml配置这样开启:

rabbitmq:
    listener:
      simple:
        ####开启手动ack  
        acknowledge-mode: manual 

在@Configuration配置类有一个这样的设置

@Bean
public SimpleMessageListenerContainer simpleMessageListenerContainer(ConnectionFactory connectionFactory){
        SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer(connectionFactory);
        simpleMessageListenerContainer.setQueueNames("my.queue.name");
        //签收模式
        simpleMessageListenerContainer.setAcknowledgeMode(AcknowledgeMode.MANUAL);
        return simpleMessageListenerContainer;
}

请问一下 在类配置里面设置自动签收模式,是不是只能自己定义SimpleMessageListenerContainer ?

然后我在消费端使用测试时,发现生产端本来只发送一次消息,消费端重复给我收到了3条消息,第三条时报错,说channel ack/nack关闭,刚好在应答响应的时候哪一行报错,由于在家里面,异常不能截图,所以只能口述

我的消费端

@RabbitListener(queues = {BusinessConst.APP_SEARCH_QUEUE_NAME})
    public void receiverMessage (Object entity, Message message, Channel channel) throws IOException {
            ...
            //重复收到三条消息之后,在第三条消息时 以下代码报错,
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);

    }
  • 写回答

2条回答 默认 最新

  • navy-lemon 2021-02-20 10:16
    关注

    根据你的问题:

    1、首先确定发送消息是否 只发了一次;

    2、发送一次的话是否一次只发送了一条消息;

    3、发送消息到mq队列后 看 队列里边是几条消息;(可以在 http://ip:15672 界面上看)

    通过以上三条 基本上可以断定 是否重复发送或者 多发消息

    4、接下来判断 消费端 的 队列名配置,是否只配置了一个消息监听 还是多个消息监听

    5、每次消息监听到之后 要手动确认

    6、手动确认时 可以判断此条消息 是否重复推送。

    以上6点 可以按顺序 逐个排查,基本上为能够解决。谢谢。

    评论

报告相同问题?

悬赏问题

  • ¥15 安霸cv22 + rtl8211f 千兆,udp传输丢包
  • ¥15 关于区块链和边缘环境搭建的相关问题
  • ¥15 windows远程桌面断卡重连软件卡顿问题
  • ¥30 Unity 实现扫描效果
  • ¥15 HbuilderX检测不到安卓模拟器
  • ¥15 这个main已经在filename.obj中定义是什么错 C语言
  • ¥15 关于#linux#的问题:exsi8.0系统 怎么更改web访问端口,不用80、443
  • ¥15 使用elementor设计样式
  • ¥15 谁能提供一个中文版的推销咨询网站连接?
  • ¥15 springboot项目程序启动报错