`
阅读更多

     在使用 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消息模式之Confirm确认消息

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

    2小时学会SpringBoot整合RabbitMQ详解

     - 项目实战中如何使用RabbitMQ,以及RabbitMQ的作用 消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的...

    sprngboot整合 rabbitMQ

    生产者发送消息,如果路由错误不能到达指定队列 解决方法有如下几种: 1使用备份交换器路由到备胎队列消费。这样可以保证未被路由的消息不会丢失。 2通过消息的回调方法,添加ReturnListener的编程逻辑.

    springboot + rabbitmq发送邮件实战 使用RabbitMQ实现获取网易邮箱发送消息业务

    4.生产者发起调用(邮件数据要入MySQL数据库,业务类名称:TestServiceImpl) 5.消费者发送邮件(类名称:MailConsumer) 6.定时任务定时拉取投递失败的消息, 重新投递 (类名称:ResendMsg) 7.各种异常情况的...

    drabbitmq:QAMQP源码解析,工作量,重新分配,公平分配,订阅发布,主题模式,路由模式,确认机制

    RabbitMQ生产者消息确认:publisher-confirms(发送到交换机确认),publisher-returns(路由到队列确认) 定时任务:@EnableScheduling,@Scheduled,cron表达式 RabbitMQ消费者消息应答:@RabbitListener,listener.simple....

    25道RabbitMQ面试题含答案(很全)

    在RabbitMQ中,一些核心概念包括生产者(发送消息的应用)、消费者(接收消息的应用)、队列(存储消息的缓存)、消息(由生产者通过RabbitMQ发送给消费者的信息)、连接(连接RabbitMQ和应用服务器的TCP连接)以及...

    rabbitmq+spring3 jar包及配置

    消息生产者使用了消息确认,消费者使用了事务 用到的包基本都是最近的新版本:spring-amqp-1.6.0.RELEASE.jar spring-rabbit-1.3.5.RELEASE.jar spring-retry-1.1.2.RELEASE.jar amqp-client-3.6.2.jar

    深入理解RabbitMQ消息队列的使用

    本课程将涵盖RabbitMQ的下述知识:RabbitMQ单节点服务搭建以及集群的搭建、RabbitMQ的整体架构及各个组件的功能、RabbitMQ当中生产者以及消费者的具体实现、消费者如何做到消息的确认、RabbitMQ如何做到消息的公平...

    RabbitMq

    消息队列解决了什么问题 异步处理 1.串行方式 2.并行方式 ...简单队列模式:最简单的工作队列,其中一个消息生产者,一个消息消费者,一个队列。也称为点对点模式 竞争消费者模式:一个消息生产者,一个交换

    深入浅出RabbitMQ

     相关概念如下:1、Producer:消息生产者;2、Broker:即RabbitMQ serveice提供者;3、Virtual Host:RabbitMQ是多租户系统,一个Broker支持多个Virtual Host,这些Virtual Host之间是彼此隔离的,Vi

    RabbitMQ:使用RabbitMQ并添加perl-test

    生产者发送的消息需要消息是否有进行确认机制,如果消费者在处理该数据时挂了则需要mq确认已处理完,防止数据纠正处理。测试mq:测试生产者,模拟消费者接收消息,并验证发出的消息的正确性测试消费者,模拟生产者去...

    word源码java-rabbitmq-tutorial-java:RabbitMQ官方教程的翻译和说明--Java版

    生产者和RabbitMQ服务器建立连接和通道,声明路由器,同时为消息设置路由键,这样,所有的消息就会以特定的路由键发给路由器,具体路由器会发送到哪个或哪几个队列,生产者在大部分场景中都不知道。(1个路由器,但...

    springboot-rabbitmq.7z

    SpringBoot Rabbitmq 消息发送手动确认demo,通过实现RabbitTemplate.ConfirmCallback 的confirm方法来手动确认,通过controller类访问,写了queue模式,topic模式和广播模式的例子,可直接运行,有生产者和消费者,...

    Java八股文最新消息中间件面试宝典

    第一个是开启生产者确认机制,确保生产者的消息能到达队列,如果报错可以先记录到日志中,再去修复数据 第二个是开启持久化功能,确保消息未消费前在队列中不会丢失,其中的交换机、队列、和消息都要做持久化 第三...

    RabbitMQ如何防止数据丢失?

    RabbitMQ提供了transaction和cofirm模式来确保生产者不丢消息. tansaction机制就是说: 发送消息前开启事务(channel.txSelect()), 然后发送消息, 如果发送过程中出现什么异常,事务就会回滚(channel.txRollback()), ...

    kanin-tutorials:RabbitMQ Kanin LFE 教程的 Gitbook

    Kanin / RabbitMQ 教程 概述 Kanin 教程有几件事: Kanin 的深入文档,LFE ... 发送消息的程序是生产者。 队列- 队列是邮箱的名称。 它存在于 RabbitMQ 中。 尽管消息流经 RabbitMQ 和您的应用程序,但它们只能存储

    bugs-bunny:使用 RabbitMQ 的兔子客户端进行可靠的消息传递

    消息的生产者和消费者都是同步的。 PHP 仍然不适合异步工作负载。 您有rabbitmq采用 您依赖于,并且您不关心消息将被处理的顺序 队列/ Exchange绑定是静态的。 即,没有应用动态路由规则,因此我们可以避免问题 您...

    java二进制补码源码-coolmq:消息最终一致性方案,基于rabbitmq的分布式事务解决方案

    传统的事务解决方案,例如TCC,都太消耗资源,而rabbitmq用两阶段确认确保了消息只要发送,就能送达。本方案是基于Spring-Boot Amqp,已经在生产上部署实践,可用于支付等跨服务调用的业务情况 一 两阶段确认 1 发送...

    wireless.zip

    >第一种情况rabbitmq提供了transaction和confirm模式来确保生产者不会丢失消息 >transaction机制是说发送消息前,开启事务(channel.txSelect()),然后再发送消息,如果发送消息的过程中出现什么异常就回滚 >(channel...

    Java思维导图xmind文件+导出图片

    Java客户端实现Kafka生产者与消费者实例 kafka的副本机制及选举原理剖析 基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 ...

Global site tag (gtag.js) - Google Analytics