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);

    }

 

根据你的问题:

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

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

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

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

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

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

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

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

已经解决 是不同模块之间的原因,

我这Common模块 里面的SimpleMessageListenerContainer并没有被消费端模块使用,当我把这个Bean 放在我消费端模块时  正常生效,