当消费者处理消息失败或者当前不能处理该消息时,可以给Broker发送一个拒绝消息的指令,并且可以要求Broker将该消息丢弃或者重新放入消息队列中。
拒绝消息有两种方式,一是一次拒绝一条消息;二是一次拒绝多条消息。
一次拒绝一条:
void basicReject(long deliveryTag, boolean requeue) throws IOException;
-
deliveryTag:发布的每一条消息都会获得一个唯一的deliveryTag,它在channel范围内是唯一的
-
requeue:表示如何处理这条消息,为true表示重新放入RabbitMQ的发送队列中,为false表示通知RabbitMQ销毁该消息
一次拒绝多条:
void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException;
-
deliveryTag:发布的每一条消息都会获得一个唯一的deliveryTag,它在channel范围内是唯一的
-
multiple:批量确认标志,为true表示包含当前消息在内的所有比该消息的deliveryTag值小的消息都被拒绝, 除了已经被应答的消息。为false则表示只拒绝本条消息
-
requeue:表示如何处理这条消息,为true表示重新放入RabbitMQ的发送队列中,为false表示通知RabbitMQ销毁该消息
需要注意的是,如果队列中只有一个消费者的时候,需要确认不会因为拒绝消息并重新放入消息队列中而导致在同一个消费者身上发生死循环。