RabbitMQ默认是自动确认,也就是消息推送给消费者之后,马上确认并销毁。但是假如消费消息的过程中发生了异常,由于消息已经销毁,这样就会造成消息的丢失。
除了自动确认之外,还有三种确认方式:手工确认、批量确认、接受拒绝。
一、手动确认。
也就是关闭了自动确认
channel.basicConsume("Queue", false, consumer);
采用try catch进行捕捉异常
使用
channel.basicAck(envelope.getDeliveryTag(), false);
可以手动确认一条消息,这里basicAck含有两个参数,第一个参数表示当前的投递标签号。相当于当前消息的Id.
每次向信道进行投递的时候都会产生一个投递标签号,每次加1,作为唯一标识。
第二个参数表示是否批量确认。true表示批量确认当前以及以前的所有消息。false表示不批量,只是当前这条消息。
二、批量确认
有了上面的解释,很容易知道,只需要将basicAck的false改为true,即可实现批量确认
三、接受拒绝
当向信道中投递的消息超过了消费者处理能力,就会造成消息积压。这是应该使用消息拒绝,放置消息无止境增长。
使用
channel.basicNack(envelope.getDeliveryTag(), false, true);
basicNack(long deliveryTag, boolean multiple, boolean requeue):deliveryTag表示被拒绝的消息的投递标签;multiple表示是否批量拒绝,若是则所有投递标签小于当前消息且未确认的消息也都将被拒绝,若否则仅拒绝当前消息;requeue表示被拒绝的消息是否重新放回队列,若是则消息会重新回到队列并选择新的消费者进行投递,若否则该条消息会被丢弃。