作者:喂_早安学院_703 | 来源:互联网 | 2023-08-26 10:08
在yml配置这样开启:
1 2 3 4 5
| rabbitmq:
listener:
simple:
####开启手动ack
acknowledge-mode: manual |
在@Configuration配置类有一个这样的设置
1 2 3 4 5 6 7 8
| @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关闭,刚好在应答响应的时候哪一行报错,由于在家里面,异常不能截图,所以只能口述
我的消费端
1 2 3 4 5 6 7
| @RabbitListener(queues = {BusinessConst.APP_SEARCH_QUEUE_NAME})
public void receiverMessage (Object entity, Message message, Channel channel) throws IOException {
...
//重复收到三条消息之后,在第三条消息时 以下代码报错,
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
} |
已经解决 是不同模块之间的原因,
我这Common模块 里面的SimpleMessageListenerContainer并没有被消费端模块使用,当我把这个Bean 放在我消费端模块时 正常生效,