在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 放在我消费端模块时 正常生效,