1.消费者的确认与拒绝
为了确保消息从队列可靠地到达消费者,RabbitMQ提供了消息确认机制。消费者在使用basicConsume方法订阅队列时,可以指定autoAck参数,当Ack为false时,RabbitMQ会等待消费者显式地回复确认信号然后才从内存中移除消息(实质上是先打上删除标记,之后删除)。当Ack为true时,RabbitMQ会自动把发送出去的消息置为确认,然后从内存中删除,不管消费者是否真正消费到了消息。
当autoAck设置为false,对于RabbitMQ服务端而言,将消息分成了两部分:等待发送给消费者的消息;已经发送给消费者但是还没有收到消费者确认信号的消息。
其中,Ready为等待发送给消费者的消息
Unacked已经发送给消费者但是还有收到消费者确认信号的消息。
消费者收到消息后,可以使用channel.basicAck 来向RabbitMQ发送确认信号,也可以使用basicReject来告诉RabbitMQ拒绝这个消息。
//确认
void basicAck(long deliveryTag, boolean multiple) throws IOException;
//拒绝
void basicReject(long deliveryTag, boolean requeue) throws IOException;
//批量拒绝
void basicNack(long deliveryTag, boolean multiple, boolean requeue)
throws IOException;
参数说明:
deliverTag 表示消息的编号,可以通过getEnvelope().getDeliveryTag()获取
requeue:如果requeue设置true,则RabbitMQ会重新将这条消息存入队列,以便发送给下一个订阅的消费者;如果为false,则将它从队列中移除。
2.关闭连接
在应用程序使用完连接和通道之后,需要关闭连接,释放资源
channel.close();
connection.close();
显示地关闭channel并不是必需的,因为在Connetcion关闭的时候,channel也会自动关闭。