确认消息
为了保证消息从队列可靠的到达消费者, RabbitMQ 提供了消息确认机制,消费者在订阅队列时,可以指定 autoAck 参数,当 autoAck 等于 false时, RabbitMQ 会等待消费者显式地回复确认信号后才从内存 (或者磁盘)中移去消息(实质上是先打上删除标记,之后再删除)。当autoAck 等于 true 时, RabbitMQ 会自动把发送出去的消息置为确认,然后从内存(或者磁盘)中删除,而不管消费者是否真正地消费到了这些消息。
当 autoAck参数置为 false,对于RabbitMQ服务端而言,队列中的消息分成了两个部分∶一部分是等待投递给消费者的消息;一部分是已经投递给消费者,但是还没有收到消费者确认信号的消息。如果 RabbitMQ一直没有收到消费者的确认信号,并且消费此消息的消费者已经断开连接,则RabbitMQ会安排该消息重新进入队列,等待投递给下一个消费者,当然也有可能还是原来的那个消费者。
拒绝消息
拒绝单条消息
void basicReject(long deliveryTag, boolean requeue) throws IOException;
deliveryTag:消息的编号
requeue:如果 requeue 参数设置为 true ,则 RabbitMQ 会重新将这条消息存入队列,以便可以发送给下一个订阅的消费者;如果 requeue 参数设置为 false ,则 RabbitMQ立即会把消息从队列中移除,而不会把它发送给新的消费者。
批量拒绝消息
void basicNack(long deliveryTag, boolean multiple , boolean requeue) throws IOException;
multiple:设置为 false 则表示拒绝编号为 deliveryTag的这条消息,这时候basicNack和basicReject 方法一样: multiple 参数设置为true则表示拒绝deliveryTag编号之前所有未被当前消费者确认的消息。
重新入队
Basic.RecoverOk basicRecover() throws IOException;
Basic.RecoverOk basicRecover(boolean requeue) throws IOException;
这个channel.basicRecover方法用来请求RabbitMQ重新发送还未被确认的消息。如果requeue参数设置为 true,则未被确认的消息会被重新加入到队列中,这样对于同一条消息来说,可能会被分配给与之前不同的消费者。如果 requeue参数设置为 false,那么同一条消息会被分配给与之前相同的消费者。默认情况下,如果不设置 requeue 这个参数,相当于channel.basicRecover(true),即 requeue 默认为 true。
网友评论