上一个,我们总结了如何确认消息是不是到达路由和队列的方法,当然了最重要的是,我们的消费者到底接收到了这个消息没有,这个消息接收的是不是正确。一般来说为了保险起见,我们的消息一般都是需要手动确认返回的。
一种是在配置文件中
spring:
rabbitmq:
listener:
simple:
acknowledge-mode: manual
这样全局的消费者都被设置为手动返回确认消息。
或者我们也可以在单独的某个接收者中使用
@Bean
public RabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory =new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
// factory.setMessageConverter(new Jackson2JsonMessageConverter());
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);//开启手动 ack
return factory;
}
来设置这个接受者类中所有的消息都是ack模式。
或者我们也可以在单独的某个接受者上用
@RabbitListener(queues ="topic.message")
public void process1(@Payload String message,@Header(AmqpHeaders.DELIVERY_TAG)long deliveryTag, Channel channel)throws Exception {
//定义队列的消费者
Consumer consumer = new DefaultConsumer(channel);
//监听队列,设置手动返回完成,第二个参数 false表示需要手动确认返回
channel.basicConsume("topic.message",false,consumer);
//手动确认返回
channel.basicAck(deliveryTag,false);
System.out.print("这里是手动返回确认信息 ");
}
这样都可以实现消费者进行手动确认返回,成功返回就是用channel.basicAck(deliveryTag,false);。
不成功就用basicNack。
如果开启了手动返回,但是没有返回的话,这条消息就会一直存在于队列中,每次都会重新接收。