RabbitMQ 高级篇八 消费端ACK与重回队列

RabbitMQ消息中间件技术精讲15 高级篇八 消费端ACK与重回队列

消费端的签收方式:

分为自动签收和手动签收。

自动签收:channel.basicConsume方法的第二个参数(autoAck)设置为true即可;

手动签收:将第二个参数设置为false即可。

手动签收又分为两种方式:

手动Ack和Nack。

两者之间的区别:

Ack表示手工签收后消息处理成功;

Nack表示手动签合后消息处理失败。这个时候broker会自动重新发送消息。

使用场景:

场景一:

假设我们设置的自动重复消息次数是3次,那么在Nack后,broker会重复发送三次消息。如果三次之后,还是Nack的,这种情况下,我们不可能一直重复发送,此时就可以设置为Ack,然后在消费端进行消费的时候,如果由于业务处理而产生的异常,我们可以进行日志的记录或者给开发人员发送警报邮件,然后进行补偿。

场景二:

如果由于服务器宕机等严重性的问题,此时是不可能收到ack或者Nack,这种情况下也会一直重复发送消息的,那么我们就需要手工的Ack,来保证消费端消费成功。在服务器重启之后,会自动的消费之前未消费成功的消息的。

以上两个案例,就体现了消费端ACK或者NACK的重要性。

下面我们来看看消费端的重回队列

消费端的重回队列:

是为了对没有处理成功的消息,把消息重新返回给broker.

注意,在一般我们在实际的应用中,都会关闭重回队列,也就是设置未false.

代码演示:

模拟需求:

我们在properties的handers中设置for循环的num。假设如果num等于1,就重回队列。

生产者中,添加properties信息:

在消息处理的类:MyConsumer类中添加重回队列的判断:

我们开源看到,调用的是nack方法。参数说明:

/**

* 参数:

*  long deliveryTag:消息标签

*  boolean multiple:是否批量

*  boolean requeue:是否重回队列

*  如果设置成true,那么失败的消息会重新放到消息的最后

*/

channel.basicNack(envelope.getDeliveryTag(),false,true);

修改完成之后,启动消费者和生产者,查看运行效果:‘

我们可以看到控制台打印的,第0个不断重复被打印。说明,下标为0的被重回到队列中了。

凯哥公众号:凯哥Java(kaigejava) 凯哥个人博客:www.kaigejava.com

下节预告:TTL队列/消息

你可能感兴趣的:(RabbitMQ 高级篇八 消费端ACK与重回队列)