`
阅读更多

     在使用 RabbitMQ 的时候,有时候当我们生产者发送一条消息到 RabbitMQ 服务器后,我们 生产者想知道消息是否到达了 RabbitMQ 服务器上。这个时候我们应该如何处理

     针对上述问题,RabbitMQ 提供了2中解决方案。

  • 通过事务机制实现(不推荐
  • 通过发送方确认(publisher confirm)机制实现(推荐)     
  • 注意:
  •        1、上方2中方式不可共存,只能选取一种,如果一个channel上开启事务又开启confirm则会报错。 
  •        2、如果发送消息的交换器没有匹配的队列,那么消息也会丢失。

通过事务机制实现

    RabbitMQ 客户端中与事务机制相关的方法共有三个。

    channel.txSelect():    用于将当前 channel 设置成事务模式

    channel.txCommit():  用于提交事务 (事务提交成功,说明消息一定到达了RabbitMQ服务器中

    channel.txRollback():用于回滚事务

    java 生产者 事务 实现的代码如下:

    注意:事务机制到发送一条消息之后会使发送端阻塞,在RabbitMQ服务端回应之后,才能继续发送下一条消息,在高并发的情况下可能性能不怎么好,因此不建议使用。

 

发送方确认机制(Comfirm Listener)

消息的确认机制有好几种,此处介绍效率最高的异步确认机制。

异步确认机制:

    1、使用 channel.confirmSelect() 将channel设置成 confirm 模式

    2、使用 channel.addConfirmListener 监控消息是否到达RabbitmqMQ

          监听器中的 deliverTagmultiple 参数见下方图中解释。

生产者将channel设置成confirm 模式后,在此channel上发布的消息都会被分派一个唯一的ID(从1开始),当消息不exchange路由到所匹配的队列后,如果消息是持久化的,那么在消息持久化后,RabbitMQ 就会发送一个确认(Basic.Ack)给生产者(包含消息的唯一ID),这样生产者就知道消息正确到达RabbitMQ了。

  java 生产者 异步确认 实现的代码如下:

 

完整代码:

事务确认:https://gitee.com/huan1993/rabbitmq/tree/master/rabbitmq-advance/src/main/java/com/huan/rabbitmq/advance/produceconfirm/tx

confrirm异步确认:https://gitee.com/huan1993/rabbitmq/tree/master/rabbitmq-advance/src/main/java/com/huan/rabbitmq/advance/produceconfirm/confirmlistener

 

  • 大小: 29.6 KB
  • 大小: 108.8 KB
分享到:
评论

相关推荐

    RabbitMQ消费者和生产者简单实现

    这两个类展示了如何在Java中创建基本的RabbitMQ生产者和消费者。在实际项目中,你可能需要处理更复杂的情况,如错误处理、多线程消费、手动确认消息接收等。此外,你还可以利用RabbitMQ的特性,例如使用不同类型的...

    RabbitMQ生产者消费者测试

    本主题将深入探讨“RabbitMQ生产者消费者测试”的相关知识点。 首先,理解生产者(Producer)和消费者(Consumer)的概念至关重要。在RabbitMQ中,生产者是发送消息的应用程序,而消费者则是接收和处理这些消息的...

    rabbitmq 实现消息插队

    在RabbitMQ中,生产者(Producer)负责发布消息,消费者(Consumer)则负责接收并处理这些消息。消息队列作为中介,存储未被消费的消息,确保即使在高并发或系统故障情况下,消息也不会丢失。 在"多人投资"场景下,...

    RabbitMQ消息模式之Confirm确认消息

    生产者进行接收应答,用来确定这条消息是否正常的发送到Broker,这种方式也是消息的可靠性投递的核心保障 消费端代码: package com.ue.confirm; import com.rabbitmq.client.Channel; import ...

    rabbitmq发送&接收消息

    生产者可以设置等待消费者确认,如果消费者没有确认,RabbitMQ可能会重新投递消息。 **8. 持久化** 为了防止消息丢失,RabbitMQ提供了消息和Queue的持久化选项。即使服务器重启,已持久化的消息和Queue也能保持。 ...

    RabbitMQ消费者C#源码

    本资源提供的“RabbitMQ消费者C#源码”是一个简单的控制台应用程序,用于接收由RabbitMQ生产者发送的消息。这个源码可以帮助我们理解如何在C#中实现一个基本的RabbitMQ消息消费者。 首先,要使用RabbitMQ的C#客户端...

    RabbitMQ详细讲解

    * Producer:生产者,负责发送消息到 RabbitMQ 服务器。 * Consumer:消费者,负责从 RabbitMQ 服务器接收消息。 * Queue:队列,存储生产者发送的消息。 * Exchange:交换机,负责将生产者的消息路由到相应的队列。...

    用PHP收发RabbitMQ消息

    三、生产者:发送消息逻辑 在发送消息时,我们需要创建一个连接,创建一个 channel,创建一个交换机对象,并发送消息。在代码中,我们首先创建了一个连接和 channel,然后创建了一个交换机对象,并发送了一条测试...

    RabbitMQ消息中间件技术精讲

    RabbitMQ作为一款消息中间件,其核心组件主要包括生产者、交换器、队列和消费者。 1. **生产者**:发送消息的一方,可以是应用程序或服务。 2. **交换器**(Exchange):接收来自生产者的消息后,根据配置规则将...

    RabbitMQ传递对象

    生产者可以配置为等待消费者的确认,一旦收到确认,RabbitMQ才会认为消息已被处理并安全地从队列中删除。 6. **路由与交换器**:RabbitMQ支持多种交换器类型(如Direct、Fanout、Topic和Header),它们决定了消息...

    rabbitMq消息接收与消费

    在RabbitMQ中,生产者是发送消息的应用,消费者是接收消息的应用。中间通过交换机(Exchange)进行消息路由,交换机会根据预定义的绑定规则(Binding)将消息投递到一个或多个队列(Queue)中。队列是存储消息的地方...

    springboot + rabbitmq 如何实现消息确认机制(踩坑经验)

    发送消息确认是指生产者发送消息到 RabbitMQ 服务器,然后等待确认消息是否发送成功;消费消息确认是指消费者消费消息,然后确认消息是否消费成功。 四、踩坑经验 在实际开发中,我们遇到了许多问题,例如消息发送...

    RabbitMQ消息中间件技术精讲.txt

    1. **消息发布**:生产者将消息发送给交换器,消息中包含路由键。 2. **消息路由**:交换器根据路由键查找与之绑定的队列,并将消息发送到这些队列中。 3. **消息消费**:消费者通过监听队列来接收消息并进行处理。 ...

    RabbitMQ消息中间件视频教程

    3. **消息确认机制**:为了确保消息不丢失,RabbitMQ提供了消息确认机制,包括手动确认(Manual Acknowledgement)和自动确认(Automatic Acknowledgement)两种方式。 4. **集群部署**:通过集群部署可以实现...

    RabbitMQ资料RabbitMQ资料

    1. **生产者**: 应用程序创建消息并发送到RabbitMQ的交换机。 2. **交换机**: 根据绑定规则,决定将消息路由到哪个队列。 3. **队列**: 存储接收到的消息,等待消费者消费。 4. **消费者**: 订阅队列,当有新消息...

    RabbitMQ消息列队

    1. **生产者发送消息**: 生产者连接到RabbitMQ,创建一个通道(Channel),然后将消息发送到交换机,指定特定的路由键。 2. **交换机路由**: 交换机根据绑定规则决定将消息放入哪个队列,或者丢弃。 3. **队列存储**: ...

    RabbitMq测试

    在“RabbitMq测试”项目中,你可能会看到如何设置生产者来发送消息,以及如何创建消费者来接收和处理这些消息的代码示例。这有助于理解RabbitMQ的工作流程,并可以在实际项目中复用这些代码片段。 总的来说,...

    tp6使用rabbitmq

    5. **创建生产者**:在TP6应用中,你需要创建一个生产者类来发送消息到队列。这通常涉及到创建一个服务容器绑定,定义一个方法来构建AMQP连接和通道,并使用`basic_publish`方法发布消息。 6. **创建消费者**:消费...

    SpringMvc rabbitMQ Demo

    5. **消息生产者**:在Spring MVC的控制器或服务层,我们可以创建一个`RabbitTemplate`实例,通过调用其`convertAndSend`方法发送消息。这个方法需要指定交换机名、路由键以及要发送的消息对象。 6. **消息消费者**...

    rabbitMQ点对点发送消息

    5. **smbSendDirect 示例**:这个示例可能涉及到使用RabbitMQ的Java客户端或者其他编程语言的客户端库,创建一个生产者(发送方)来向队列发送消息,并创建一个消费者(接收方)来从队列中接收并处理消息。...

Global site tag (gtag.js) - Google Analytics