RabbitMQ消息中间件技术精讲15 高级篇八 消费端ACK与重回队列
- RabbitMQ学习系列教程
- 时间:2019-08-02 09:11
- 6569人已阅读
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
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的被重回到队列中了。
下节预告:TTL队列/消息