RabbitMQ养成记 (8. 消费者接受消息可靠性 consumer Ack)

news2024/11/25 14:47:32

Consumer Ack

ack 指的是acknowledge 确认, 指的是消费端收到消息后的确认方式。
有三种确认方式:

  • 自动确认
  • 手动确认 (根据业务情况 手动确认是否成功发送)
  • 根据异常情况确认

我们在消费端用代码实践一下:
首先我们定义监听器来获取消息:

@Component
public class RabbitMQListener {
    @RabbitListener(queues = "boot_queue")
    public void ListenerQueue(Message message){
        System.out.println(Arrays.toString(message.getBody()));
    }

}

你只需要指定 queues 队列 就可以了 这是最简答的一种方式。

有些新手可能会问? 拿到消息 不是要实现MessageListener接口并重写onMessage方法吗???

这种也可以 不过这是一种 比较传统的方法:
这里解释一下:


当你不使用@RabbitListener注解时,需要实现MessageListener接口并重写onMessage方法,是因为这是一种传统的方式来定义 RabbitMQ 的消息监听器。
MessageListener接口定义了一个用于处理消息的方法onMessage,当消息到达监听容器时,容器会调用该方法,并将消息作为参数传递给方法。
当你使用SimpleMessageListenerContainer或其他类似的监听容器来配置 RabbitMQ 的消息监听器时,需要显式地指定一个实现了MessageListener接口的对象作为消息监听器。容器会负责接收消息,并将其传递给监听器的onMessage方法进行处理。
而使用@RabbitListener注解的方式,是Spring AMQP提供的一种更简化和方便的方式,用于声明消息监听器的方法。通过注解标记的方法会被框架自动识别为消息监听器,并处理消息的接收和转换。
使用@RabbitListener注解的方法不需要显式实现MessageListener接口,是因为框架会自动处理消息的转换,并将消息内容作为方法的参数传递进去。
总结起来,使用@RabbitListener注解的方式是Spring AMQP提供的一种便捷方式,可以更轻松地定义和配置消息监听器。而不使用注解的情况下,需要显式实现MessageListener接口并重写onMessage方法,是一种传统的方式来定义 RabbitMQ 的消息监听器。


在yml中设置手动ack:

spring:
  rabbitmq:
    host: ***********
    username: guest
    password: guest
    virtual-host: /
    port: 5672
    listener:
      simple:
        acknowledge-mode: manual

代码:

@Component
public class RabbitMQListener {

    @RabbitListener(queues = "boot_queue")
    public void ListenerQueue(Message message,
                              @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag,
                              Channel channel) throws IOException {
        try {
            System.out.println("收到消息为"+new String(message.getBody()));

            System.out.println("处理业务逻辑。。");

            channel.basicAck(deliveryTag,true);

        }catch (IOException e){
            //拒绝签收
            //这里的第三个参数表示 如果为true 消息重回到queue broker会重新发送该消息给消费端
            channel.basicNack(deliveryTag,true,true);
           
           //从系统解耦的角度上讲这个地方 应该为false 因为你业务失败了 上游是不会再给你发一次的

        }
    }

}

然后我们把原来的代码扩充一下 在这里实现 手动的ack。

这里有一个大坑 卡了我半天。 网上好多教程里面 这个ackmode设置直接可以在@RabbitListener注解里面设置,但是我的spring版本里面 RabbitListener接口就没有这个 ack这个属性 西巴
最后发现在yml里面配置就好了

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不会还有人不知道软件测试报告模板怎么写吧?

在测试岗位上,写报告是一项非常重要的软技能,写得好可以加分,写不好必然减分。 但在测试岗位上,提测“通过”和提测“不通过"的软件测试报告所包含的内容是不一样的(这是个坑)。但很多测试新人可能并…

LIO-SAM UBUNTU16.04.7 ROS-KINETIC 环境 编译 安装

简单记录一下 VMWARE workstation15UBUNTU16.04.7ros-kineticgtsam4.0.0 (默认16.04比较老旧,不好用,vmtools也都没有,选了一个.7) 选16.04版本的理由也简单,只是为了参考一个博客,单独建的环…

C语言-易错点汇总

易错点汇总 指针数组和数组指针(*p).astruct stdent和typedef struct stdentF5和CtrlF5const的位置全局变量和局部变量两个相同的常量字符串数组名和&数组名数组指针定义的解读int (*arr[10])[5]数组传参(* (void (*)())0)();关于数组名是否表示整个数组和数组首元素的地址…

Java位运算

Java >>和>>>的区别 | 或: 有1得1, 全0得0 int temp a|c;System.out.println(Integer.toBinaryString(a));System.out.println(Integer.toBinaryString(c));System.out.println(Integer.toBinaryString(temp));/*** 结果输出* * 01* …

对比SQL学Python:筛选|条件判断

SQL里筛选数据主要用到了where、and、in等语句。而在Python里实现筛选的方式比较多样,用到了 与&或|非~ 逻辑运算符,和isin()函数等。我们感受一下二者的区别吧: 汇总: 类型Python语句参考单条件筛选 data[data[shop_type]A…

Python复制目录及其子目录下的所有文件到指定新目录并重命名

Python复制目录及其子目录下的所有文件到指定新目录并重命名 前言前提条件相关介绍实验环境Python复制目录及其子目录下的所有文件到指定新目录并重命名代码实现输出结果 前言 本文是个人使用Python处理文件的电子笔记,由于水平有限,难免出现错漏&#x…

最常用的界线矢量数据大合集(文末有附下载方法)

最近收集了挺多比较常用的矢量界线数据,例如地理分区、气候分区等界线数据,在日常制图、学习、科研等方面使用频率比较高。废话不多说,这里给大家分享一下!! 1、中国农业熟制区划矢量数据 2、黄土高原空间范围矢量数据…

【Leetcode -509.斐波那契数 -520.检测大写字母】

Leetcode Leetcode - 509.斐波那契数Leetcode - 520.检测大写字母 Leetcode - 509.斐波那契数 题目:斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。 该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。…

node笔记_koa框架是什么?

文章目录 ⭐前言⭐ koa框架是如何发展而来的?⭐ koa框架的基本使用💖 安装 koa💖 koa的Middleware示例💖 支持xml ⭐ 结束 ⭐前言 大家好,我是yma16,本文介绍node的一个web框架koa。 往期文章 node_window…

第三章: Mybatis-Plus 的通用CRUD API 练习使用

目录 1. Insert 操作 -> Create 1.1: TableId 的 id策略 1.2: TableField 2. Update 操作 -> Update 2.1: 根据 ID 更新 2.2: 根据条件更新 3. Delete 操作 -> Delete 3.1: deleteById 3.2: deleteByMap 3.3: delete 3.4: deleteBatchIds 4. Select 操作 -&g…

Redis修炼 (15. redis的持久化-RDB)

RDB 就是 redis database backup file 数据备份文件 就是把内存中的所有数据都保存在磁盘中。 save 注意这个保存过程是主进程在做 因为redis 是单线程 所有其他所有请求都会被卡死。 bgsave 这个稍微友好一点 是子进程 执行,避免主进程收到影响。 redis在服务停机…

【JavaWeb】-- Maven基础、MyBatis

文章目录 Maven基础1.Maven简介1.1 Maven模型1.2 仓库 2.Maven安装3.Maven基本使用3.1 Maven常用命令3.2 Maven生命周期 4.IDEA使用Maven4.1 IDEA配置Maven环境4.2 Maven坐标4.3 IDEA 创建Maven项目 5.依赖管理5.1 使用坐标引入jar包5.2 依赖范围 MyBatis1.MyBatis概述1.1JDBC的…

JDK、JRE和JVM三者的区别和联系

一、JDK、JRE、JVM分别是什么 (一)JDK JDK,全称Java Development Kit,是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的Java应用程序。JDK是整个Java开发的核心。 (二)JRE J…

Day970.数据库表解耦 -遗留系统现代化实战

数据库表解耦 Hi,我是阿昌,今天学习记录的是关于数据库表解耦的内容。 微服务拆分之初,需要搭建好的两个基础设施,一个是基于开关的反向代理,另一个是数据同步机制。 有了这两个设施做保障,接下来就可以…

Python合并同名Labelme标注文件内容

Python合并同名Labelme标注文件内容 前言前提条件相关介绍实验环境Python合并同名Labelme标注文件内容Json文件代码实现输出结果json文件 前言 本文是个人使用Python处理文件的电子笔记,由于水平有限,难免出现错漏,敬请批评改正。 (https://b…

Sping核心知识点总结

Spring框架日渐成熟,已经成为java开发中比不可少的部分,框架这东西我的理解里属于工具型应用,意味着如果没有大量实践之前之间研究理论 研究源码之类的 体会会很效率会很低,所以个人建议萌新先找个项目做一做,感受一下…

【C/C++的内存管理】

欢迎阅读本篇文章 前言🍕1. C/C内存分布1.1有关C/C的一道题目 🍕2. C语言中动态内存管理方式:malloc/calloc/realloc/free🍕3. C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 🍕4. operator …

论国内如何免费使用GPT4

什么是GPT,能做什么? GPT,全名为Generative Pre-trained Transformer,是一类基于Transformer架构的自然语言处理模型。GPT的主要功能包括: 文本生成:能够根据给定的输入生成合理的文本,如文章、…

双向链表实现约瑟夫问题

title: 双向链表实现约瑟夫问题 date: 2023-05-16 11:42:26 tags: **问题:**知n个人围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去&…

Java进阶-Collection集合

1.Collection集合 1.1数组和集合的区别 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的…