rabbitmq消费端确认机制
为了保证消息从队列可靠的到达消费者,rabbitmq提供了消息确认机制(message acknowledgement
)。
消息确认
消费者在订阅队列时,可以指定autoAck
参数:
- 当
autoAck
等于true
时,rabbitmq会自动把发送出去的消息置为确认,然后从内存(或者磁盘)中删除,而不管消费者是否真正的消费到了消息 - 当
autoAck
等于false
时,rabbitmq会等待消费者显示的回复确认信号后才从内存(或者磁盘)中删除消息。此时消费者有足够的时间去处理消息,不用担心消费者进程挂掉后消息丢失的问题
消息拒绝
消费者如果接收到消息后,想明确的拒绝而不是确认,可以通过:
channel.basicReject(deliveryTag, requeue);
其中deliveryTag
可以看作是消息的编号,requeue
为true时,rabbitmq会重新将这条消息加入队列,以便发送下一个订阅的消费者;如果requeue
为false
时,rabbitmq会立刻把消息从队列中删除,而不会把它发送给新的消费者
而channel.basicReject
方法一次性只能拒绝一条消息,如果要指批量拒绝,可以调用:
channel.basicNack(deliveryTag, multiple, requeue)
当multiple
为false时,只能描绘一条消息,作用和channel.basicReject
一样;multiple
为true时,表示拒绝deliveryTag
编号之前所有未被当前消费者确认的消息