首页 > 其他分享 >【RabbitMQ消息中间件】6.消息的确认模式

【RabbitMQ消息中间件】6.消息的确认模式

时间:2023-03-19 11:02:51浏览次数:33  
标签:消费者 QueueingConsumer 队列 确认 模式 RabbitMQ 消息中间件 channel


上一篇讲解了如何使用Java实现一个work队列模式,并实现能做多劳的效果。本篇我们来了解一下有关RabbitMQ的“消息的确认模式”。

当消费者从队列中获取消息后,服务端是如何知道自己被消费的呢?在RabbitMQ中服务端确认消息是否被消费成功,有两种确认模式:
(1)自动确认
    只要消息从队列中获取,无论消费者获取到消息后是否有成功接收的反馈,都认为是消息已经被成功消费。

(2)手动模式
    消费者从队列中获取消息后,服务器会将消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么消息将一直处于不可用状态。

那么,以上两种模式的应用场景是什么呢?这就要看实际开发中的需求情况来定。

例如,我们在之前编写的“HelloWorld”简单队列模式的样例中,我们获取消息的代码为:

//获取消息
while(true){
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println("[Consumer] Received '"+ message +"'");
}

此时可以看到,我们在消费者从队列中获取数据后,没有做其他处理,说明这种模式是自动确认模式。



而在上一篇我们讲解work队列模式时,编写的消费者获取信息代码如下:


// 获取消息
int Count = 0;// 统计收到的信息历史条数
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println(" [consumer1] Received '" + message + "'");
System.out.println(" now Received MessageSize:'" + ++Count + "'");
//休眠10ms
Thread.sleep(10);
// 返回确认状态
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}

这里的“channel.basicAck...”就是给服务器一个反馈,告知服务器已经成功消费,这里是属于“手动模式”。



“手动模式”与“自动模式”的区别就是,当我们创建消费者对象并且设置消费者对队列进行监听时,设置的第二个参数的不同,对于自动模式:


//定义队列的消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
//监听队列
channel.basicConsume(QUEUE_NAME, true,consumer);

对于手动模式:


// 定义队列的消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 监听队列,手动返回完成
channel.basicConsume(QUEUE_NAME, false, consumer);

上面的两段代码中,basicConsume方法的三个参数分别代表:队列名称、是否自动确认(否将需要手动确认)、接收消息的消费者对象。


所以在定义消费者监听队列时,设置basicConsume方法的第二个参数为true,则使用的是自动模式,下面消费者接收完信息后无需确认。而当第二个参数为false时,下面的消费者接收完信息后需要进行手动编码确认(channel.basicAck...)。


标签:消费者,QueueingConsumer,队列,确认,模式,RabbitMQ,消息中间件,channel
From: https://blog.51cto.com/u_16012040/6131006

相关文章

  • 【RabbitMQ消息中间件】5.work模式
    上一篇讲解了如何使用Java连接RabbitMQ服务,并实现一个简单队列模式。本篇讲解RabbitMQ的另一个队列模式----work模式。work的队列模式图如下所示:可以看......
  • 【RabbitMQ消息中间件】3.管理界面中的功能
    上一篇我们讲解了RabbitMQ的安装和网页管理工具的启动,并且简单的创建了用户和权限。本篇讲解一下RabbitMQ管理工具中其它的一些管理功能。首先确保Rabb......
  • 【RabbitMQ消息中间件】1.RabbitMQ简介
    一、什么是MQ?MQ为MessageQueue,即是“消息队列”,它是应用程序和应用程序之间的同新方法。遵循MessageQueue规则开发出来的,具有消息队列特点的产品,都可以称之为“消息中间......
  • rabbitmq概述
    一、rabbitmq的目的rabbitmq主要有三个目的:1.流量削峰  优点是:使用消息队列做缓冲 2.应用解耦  订单系统只要发送命令等待mq回复就行,不用等待三个系统的命......
  • Vue.js props配置(微信收款确认流程)
    视频直接修改外来数据props会产生警告props配置项1.功能:让组件接收外部传过来的数据2.传递数据:```<Demoname="xxx"/>```3.接收数据:1.第一种方式(只接收......
  • rabbitmq 基本常用操作
    目录常用操作当前窗口启动rabbitmq后台启动rabbitmq停止rabbitmq查看所有队列查看所有虚拟主机在ErlangVM运行的情况下启动RabbitMQ应用查看节点状态查看所有可用的插......
  • rabbitmq最佳实践
    在使用消息机制时,我们通常需要考虑以下几个问题:消息不能丢失保证消息一定能投递到目的地保证业务处理和消息发送/消费的一致性本文以RabbitMQ为例,讨论如何解决以上......
  • rabbitmq使用
     Usagerabbitmqctl[--node<node>][--timeout<timeout>][--longnames][--quiet]<command>[<commandoptions>]Availablecommands:Help:help......
  • RabbitMQ - 生产者消息确认、消息持久化、消费者消息确认、消费失败重试
    1.生产者消息确认RabbitMQ提供了publisherconfirm机制来避免消息发送到MQ过程中丢失。这种机制必须给每个消息指定一个唯一ID。消息发送到MQ以后,会返回一个结果给发送者,......
  • rabbitmq-demo
    demoConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。ConnectionF......