前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RabbitMQ 高级篇八 消费端ACK与重回队列

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

原创
作者头像
凯哥Java
修改2019-08-02 10:06:45
1.8K0
修改2019-08-02 10:06:45
举报
文章被收录于专栏:凯哥Java凯哥Java

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队列/消息

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档