消费端的确认与拒绝

 消费端的确认与拒绝:

       为了保证消息从队列可靠地到达消费者,RabbitMQ提供了消息确认机制。

 消费者在订阅队列时,可以指定autoAck参数,

参数 autoAck:

  1.   为false时,RabbitMQ会等待消费者显示地回复确认信号。
  2.  为 true时,   RabbitMQ会自动把发送出去的消息置为确认
  3.  然后才从内存(或者磁盘)中移除消息(实际上是打上删除标记,再删除)。

      采用消息确认机制之后,只要设置autoAck参数为false,消费者就有足够的时间处理消息,不用担心处理消息过程中 消费者进程挂掉后消息丢失的问题,因为RabbitMQ会等待直到显示调用Basic.Ack命令

     当autoAck参数被设置为false时,对于RabbitMQ服务端而言,队列里的消息分为两种一部分是等待投递给消费者的消息,一部分是已经投递给消费者等待回复的消息。
     如果RabbitMQ一直没有收到消费者的确认信号,并且消费此消息的消费者断开连接,RabbitMQ会安排此消息重新进入队列。

 判断消息是否需要重新投递给消费者的唯一依据:

 消费该消息的消费者连接是否已经断开

 RabbitMQ查看队列中投递给消费者但未收到确认信号的消息数

root@song-PC:/home/song# rabbitmqctl list_queues name messages_unacknowledged
Listing queues ...
hello	0
queue_test	0
song_queue	1
queue_demo	0

拒绝消息

   拒绝消息,从队列将消息删除,不重新投放

   channel.basicReject(deliveryTag,false);

  •  deliveryTag: 可以看做消息的编号,它是一个64位的长整型值, Basic.Reject 命令一次只能拒绝一条消息,如果想要批量拒绝消息,则使用Basic.Nack这个命令

   未被确认的消息,重新加入到队列

  channel.basicRecover();     

  •  消费者客户端调用该方法来告诉RabbitMQ来拒绝这个消息, requeue 参数设置为true,则RabbitMQ会重新将这条消息存入队列,以便发给下一个消费者, 如果requeue为false,则RabbitMQ立即把消息从队列中移除,而不会发给新的消费者。

     将channel.basicReject或者channel.basicNack中的requeue设置为false, 可以启用死信队列的功能。死信队列可以通过检测
被拒绝或者未送达的消息来追踪问题。对于requeue,AMQP还有一个命令Basic.Recover具备可重入队列的特性

  •   Basic.RecoverOk basicRecover() throw IOException;
  •   Basic.RecoverOk basicRecover(boolean requeue) throw IOException;

   这个方法用来请求RabbitMQ重新发送还未被确认的消息。
          如果requeue为true, 则未被确认的消息会被重新加入队列
          如果requeue为false, 则同一条消息会分配给之前的消费者。默认为true;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值