springboot整合rabbitmq实现消息确认机制

[Java实战]Spring Boot整合RabbitMQ:实现异步通信与消息确认机制(二十七) 阅读详情

本来想些关于springboot整合rabbitmq中的direct模式,结果出现了消息无法全部消费完。等这个bug解决了再写这个吧

今天先写rabbitmq的消息确认机制

先修改配置文件

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: admin
    password: admin
    virtual-host: /
    listener:
      simple:
        acknowledge-mode: manual
        prefetch: 1
    publisher-confirms: true #开启消息确认机制
    publisher-returns: true #支持消息发送失败返回队列
@Configuration
public class TopicConfiguration {

    @Bean
    public Queue queueA(){
        return new Queue("topicC");
    }

    public TopicExchange topicExchange(){
        return new TopicExchange("topicExchange");
    }

    Binding binding(Queue queueA, TopicExchange topicExchange){
        return BindingBuilder.bind(queueA).to(topicExchange).with("topic");
    }
}

 先看消费端的代码:

channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);中的false,是将自动确认机制关闭

关于channel接口的使用请参考

https://www.cnblogs.com/piaolingzxh/p/5448927.html

@Component
public class TopicReceive {

    @RabbitHandler
    @RabbitListener(queues = "topicC")
    public void receive(Message message, Channel channel) throws IOException {
        try {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
            System.out.println("接受到的消息为"+new String(message.getBody(),"UTF-8"));
        } catch (Exception e) {
            channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
        }
    }
}

发送端代码:

实现RabbitTemplate.ConfirmCallback接口,重写confirm方法

@Component
public class TopicSend implements RabbitTemplate.ConfirmCallback {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void send(String msg){
        rabbitTemplate.setConfirmCallback(this);
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        System.out.println("发送的消息为"+msg);
        this.rabbitTemplate.convertAndSend("topicExchange","topic",msg,correlationData);
    }

    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        System.out.println("消息id:" + correlationData.getId());
        if (ack) {
            System.out.println("消息发送确认成功");
        } else {
            System.out.println("消息发送确认失败:" + cause);
        }
    }
}

 测试结果会发现正常

但是如果我们将exchange修改,发送到一个不存在的exchange中,会怎么样呢?

会发现confirm回调为false,打印出结果为不存在topicExchange1111的交换机

 如果我们在消费端处理逻辑时出错会怎么样呢?修改消费端代码我们在消费时让它报错

confirm回调为true,但是在rabbitmq的web界面会发现存在一条没有消费的消息

如果我们把channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);中最后一个参数改为false呢,会发现在web管理界面没有未被消费的消息,说明这条消息已经被摒弃。

实际开发中,到底是打回到队列呢还是摒弃,要看自己的需求,但是打回队列应该有次数限制,不然会陷入死循环。

继续修改发送端的代码,在原先的基础上在实现RabbitTemplate.ReturnCallback接口。同时在发送端添加

rabbitTemplate.setReturnCallback(this)以及在application.yml中添加

@Component
public class TopicSend implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void send(String msg){
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        System.out.println("发送的消息为"+msg);
        this.rabbitTemplate.convertAndSend("topicExchange","topic",msg,correlationData);
    }

    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        System.out.println("消息id:" + correlationData.getId());
        if (ack) {
            System.out.println("消息发送确认成功");
        } else {
            System.out.println("消息发送确认失败:" + cause);
        }
    }

    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        try {
            System.out.println("return--message:" + new String(message.getBody(), "UTF-8") + ",replyCode:" + replyCode
                    + ",replyText:" + replyText + ",exchange:" + exchange + ",routingKey:" + routingKey);
        } catch (UnsupportedEncodingException e) {
        }
    }
}

 发送时,将routingKey修改为一个没有的key,

打印结果:

结论:

如果消息没有到exchange,则confirm回调,ack=false

如果消息到达exchange,则confirm回调,ack=true

exchange到queue成功,则不回调return

exchange到queue失败,则回调return

Springboot 整合Websocket+Stomp协议+RabbitMQ做消息代理 实例教程 前言 如果你还没有了解过websocket,关于整合websocket的简单入门使用,可以先看看我这篇: 《SpringBoot 整合WebSocket 简单实战案例》 https://blog.youkuaiyun.com/qq_35387940/article/details/93483678 ok,若你是通过关键字搜索到该篇的,那么我清楚你想了解什么,这也是我写该篇文章的目的。 我想让所有人对springboot整合 webSocket 再也不陌生,再也怕去整合,包括使用rabbitmq等... 阅读详情

相关推荐

rabbitmq消息确认机制及死信队列的使用

关于rabbitmq的基本概念和相关的理论这里就不做过多介绍了,在之前的篇幅中有过相应的介绍,也可以查询一些资料详细了解一下rabbitmq的基础知识,下面要介绍的点主要包括两个方面, 1、rabbitmq的消息确认机制; 2、rabbitmq的延时队列,也称作为死信队列的一些研究心得分享 为什么会产生消息确认这个概念呢?其实rabbitmq的模式是我们熟悉的典型的观察者模式的具体实现,或者说是监...

congge 3万+

RabbitMQ学习(六)——消息确认机制(Confirm模式)

在上一篇文章中我们讲解了RabbitMQ中的AMQP事务来保证消息发送到Broker端,同时我们可以在事务之间发送多条消息(即在channel.txSelect()和channel.txCommit()之间发送多条消息,通过使用事务来保证它们准确到达Broker),如果忘记了事务的使用,可以复习一下上一篇文章——RabbitMQ学习(五)——消息确认机制(AMQP事务)。 但是使用事务虽然可以保...

Anumbrella 4万+

2025年数学建模美赛(MCM)C题阅读与思考

2025年数学建模美赛(MCM)C题阅读与思考

carefreekid123的博客 7339

Spring Boot 整合 RabbitMQ 消息确认机制

1. 消息确认机制 在使用RabbitMQ的时候,可能会出现消息丢失的情况,这个时候就需要使用消息确认机制来保证消息的可靠生产和可靠消费 生产端消息确认: ​ ConfirmCallback:消息从生产端到交换机触发该回调函数 (无论成功或失败) ​ ReturnsCallback:消息从交换机到到队列触发该回调函数(消息发送失败) 消费端消息确认: ​ 手动ACK进行确认 2. 生产端消息确认 2.1 配置文件 spring: rabbitmq: # 开启confirm消息发送回调函

Pole丶逐 531

Ubuntu 22.04下Colmap带CUDA支持的编译安装全攻略(附显卡架构查询指南)

本文详细指导在Ubuntu 22.04系统上从源码编译安装支持CUDA加速的Colmap,解决了官方版本无GPU支持导致处理速度慢的问题。重点包括环境依赖准备、CUDA工具链配置、显卡计算能力查询以及完整的编译安装步骤,旨在帮助研究者和开发者高效部署高性能三维重建工具。

gold8的专栏 344

UCOS-III 系统移植

UCOSIII系统移植到GD32F303详细过程 工程代码:https://github.com/jslaobing/techIot_ucosiii_porting

TechIoT - 探索物联网与嵌入式系统 2086

基于Springboot搭建java项目(十五)——RabbitMq的确认机制和延时通知

在RabbitConfig中两个回调函数,一个叫 ConfirmCallback ,一个叫 RetrunCallback;

m0_46616045的博客 2269

避坑指南:SAP成本中心分割结构配置常见错误及解决(含KA06/KL01前置步骤)

本文深入解析了SAP成本中心会计中分割结构配置的关键步骤与常见错误。重点强调了配置前必须通过KA06创建次级成本要素(类别42)和通过KL01创建活动类型这两个核心前置步骤,并详细剖析了在OKES中定义分割规则及版本时的高频报错原因与解决方案,帮助顾问和运维人员有效规避配置陷阱,确保成本分摊的准确性。

pear55的博客 864

spring boot实战(第十二篇)整合RabbitMQ

前言 本篇主要讲述Spring Boot与RabbitMQ的整合,内容非常简单,纯API的调用操作。  消息生产者 不论是创建消息消费者或生产者都需要ConnectionFactory ConnectionFactory配置 创建AmqpConfig文件AmqpConfig.java(后期的配置都在该文件中) @Configuration public

liaokailin的专栏 11万+

西门子PLC1200与CB1241模块的Modbus RTU从站配置全流程(附串口调试技巧)

本文详细介绍了西门子S7-1200 PLC与CB1241通信模块实现Modbus RTU从站配置的全流程,包括硬件接线规范、TIA Portal工程组态、通信指令编程及串口调试技巧。通过实战案例和常见错误处理方案,帮助工程师快速搭建稳定的工业通信系统,提升自动化设备的互联互通能力。

weixin_29165725的博客 324

从solidworks导出URDF模型

一、下载sw_urdf_exporter插件 ROS目前提供了SolidWorks转URDF的插件,叫做sw_urdf_exporter,从http://wiki.ros.org/sw_urdf_exporter下载sw2urdfSetup.exe文件,下载后点击安装,安装完成后就能在solidworks中导出URDF模型了。 二、创建solidworks模型 下面以较为简单的四轮小车为例进行说...

weixin_45168199的博客 4万+

RabbitMQ--发送方确认及消息重试

之前我们在七大工作模式中简单说了发送方确认,就是生产者到RabbitMQ这一过程中,消息是否正确到达服务器,生产者要进行确认的过程一共有两种确认模式。

huapiaoy的博客 1899

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。

张哥频道:电生理信号和磁共振成像 1181

Spring Boot 整合 RabbitMQ五种模式,实现消息确认机制,以及消息失败重发, 保证消息的可靠性(极端条件除外)!

一.安装RabbitMQ 1.安装erlang。 官网地址:http://www.erlang.org/downloads。 2.安装rabbitmq,官网地址:http://www.rabbitmq.com/download.html。 3.安装成功之后,在开始菜单中找到RabbMQ Server,选择RabbMQ Server start既可启动消息队列 4. 在浏览器输入http://12...

a870368162的博客 3260

【Godot】【工程】中文字体与多语言(缺字/体积/打包:一次性配置到位)

本文介绍了Godot游戏开发中的中文字体配置与多语言支持方案。主要内容包括:1)中文字体的全局与局部设置;2)使用子集化技术减小字体体积;3)多语言资源管理及翻译系统实现;4)语言切换机制与控件刷新方法;5)字体回退策略优化显示效果;6)打包优化建议。文章提供了从字体导入到多语言实现的完整解决方案,帮助开发者系统性解决中文显示和多语言支持问题,同时优化资源体积和性能表现。配套案例可供学习参考。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 597

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

笔记 ── Springboot 整合 RabbitMQ 消息确认机制和能者多劳实现

在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达broker代理服务器呢?如果不进行特殊配置的话,默认情况下发布操作是不会返回任何信息给生产者的,也就是默认情况下我们的生产者是不知道消息有没有正确到达broker的,如果在消息到达broker之前已经丢失的话,持久化操作也解决不了这个问题,因为消息根本就没到达代理服务器,你怎么进行持久化,那么这个问题该怎么解决呢? Rab

小肥羊的博客 1009

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SpringBoot整合RabbitMq实现ACK机制--消息回退机制--消息确认机制

投递消息未成功,这里一般会记录下当前消息的详细投递数据,方便后续做重发或者补偿等操作。为确保消息发送的准确性,设置发布时确认,确认消息是否到达 Broker 服务器。消息只要被Broker接收,就会触发。,如果消费失败或异常了,可做补偿机制。如果消息未能投递到目标。

weixin_44232093的博客 1958

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RabbitMQ之spring-boot-starter-amqp的应用

RabbitMQ—spring-boot-starter-amqp 前言 上一篇 RabbitMQ 已对RabbitMQ和AMQP的概念进行了学习 这一篇的目的主要是使用Spring Boot的spring-boot-starter-amqp整合RabbitMQ,以达到加深理解的目的。 时间线 2020.09.14-2020.09.15——完成初稿 参考链接 RabbitMQ系列 Springboot 整合RabbitMq ,用心看完这一篇就够了 流程 引入依赖->配置->编码 引入依赖 使

zhj_1121的博客 7967

SpringBoot整合RabbitMQ实现消息的发送与接收

RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,用于在分布式系统中存储转发消息。RabbitMQ 凭借其高可靠、易扩展、高可用及丰富的功能特性收到越来越多企业的青睐。 【实例】SpringBoot整合RabbitMQ实现消息的发送与接收。 实例要求: 实现SpringBoot整合RabbitMQ框架。 实现RabbitMQ消息确认机制(ACK)。 实现RabbitMQ消息队列延迟功能。

pan_junbiao的博客 6764

SpringBoot2.x整合RabbitMQ(完整版)

本篇文章实现了 SpringBoot整合RabbitMQ,实现了 work模型,发布订阅模型,topic模型,confirm消息确认机制,return消息机制,TTL队列,死信队列等。整合方式有很多,比如使用 RabbitAdmin进行整合,本文介绍一个最简单的整合方式,只需要在 RabbitmqConfig.java 配置文件中进行简单配置,便可以方便的使用。相信你会喜欢这种方式的

孔明的博客 4万+

SpringBoot整合RabbitMQ系列--消息确认的使用

本文介绍SpringBoot整合RabbitMQ如何进行消息的确认。

IT利刃出鞘的博客 2564

springboot整合rabbitmq,支持消息确认机制

springboot整合rabbitmq,支持消息确认机制  安装 推荐一篇博客 https://blog.youkuaiyun.com/zhuzhezhuzhe1/article/details/80464291 项目结构 POM.XML <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven...

otherCoco的博客 1万+

RabbitMq学习——Springboot整合rabbitmq之手动消息确认(ACK)

一、前言 前几天我研究了关于springboot整合简单消息队列,实现springboot推送消息至队列中,消费者成功消费。同时也加了消息转发器,对消息转发器各种类型的配置等做了总结。 但是,主要还有一点,我一直存在疑问:如何确保消息成功被消费者消费? 说到这里,我相信很多人会说使用ack啊,关闭队列自动删除啊什么的。主要是道理大家都懂,我要实际的代码,网上找了半天,和我设想的有很大差异,还是自...

专注写bug 1万+

RabbitMQ学习----------------------ack消息确认机制

为了保证消息从队列可靠的到达消费者,RabbitMQ提供了消息 确认机制,消费者在订阅队列的时候,可以指定autoAck参数,当autoACK等于false时,RabbitMQ会等待显示的恢复确认信号之后才从内存或者磁盘中移除消息(实质上是先打上删除标记,之后再删除) 当autoAck属性为true的时候,RabbitMQ会自动把发送出去的消息标记为确认,然后从内存或...

tom有cat 1180

centos7安装rabbitmq_利用SpringBoot+RabbitMQ,实现一个邮件推送服务

一、流程图本文内容主要围绕这个流程图展开,利用 RabbitMQ 消息队列,实现生产者与消费者解耦,所以有必要先贴出来,涵盖了 RabbitMQ 很多知识点,如:消息发送确认机制消费确认机制消息的重新投递消费幂等性, 等等二、实现思路1.在虚拟机创建一个CentOS7上,并安装 RabbitMQ2.开放QQ邮箱或者其它邮箱授权码,用于发送邮件3.创建邮件发送项目并编写代码4.发送邮件测试...

weixin_39922476的博客 335

RabbitMQ笔记(二)SpringBoot整合RabbitMQ之simple容器(生产者)

目录一、简介二、Maven依赖三、消息确认3.1 消息发布确认ConfirmCallback3.2 消息到达确认ReturnsCallback四、核心配置类五、配置文件六、测试类TestProductService结语 一、简介   本文主要用使用Spring Boot(2.5.2)来整合RabbitMQ(2.5.2),使用simple容器实现一个生产者。本文的前提是有一个安装好的RabbitMQ的环境,及我的上一篇文章里消费者服务:   链接: RabbitMQ笔记(一)SpringBoot整合Rabbi

嘉禾嘉宁papa 6378
上一篇: springboot整合rabbitmq入门(二)
下一篇: springboot整合quartz(一)
若往夕之
博客等级 码龄9年 20粉丝 82原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值