rabbitmq 注解配置使用(四)消息确认(消费)

上一个,我们总结了如何确认消息是不是到达路由和队列的方法,当然了最重要的是,我们的消费者到底接收到了这个消息没有,这个消息接收的是不是正确。一般来说为了保险起见,我们的消息一般都是需要手动确认返回的。

一种是在配置文件中

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。

如果开启了手动返回,但是没有返回的话,这条消息就会一直存在于队列中,每次都会重新接收。

你可能感兴趣的:(rabbitmq 注解配置使用(四)消息确认(消费))