【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的消息队列:使用 RabbitMQ 实现异步处

news2025/4/1 12:59:25

  <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、开篇整活儿

今儿个咱唠唠 Spring Boot 里头的消息队列。这玩意儿吧,说大不大,说小不小,整好了是锦上添花,整不好就是火上浇油。你要是刚入门,那可得悠着点儿,别一上来就整得自己“翻车”了。

二、消息队列是啥玩意儿?

消息队列是系统解耦的一个利器,说白了就是把一些耗时的操作放到队列里头,让系统慢慢处理,不用阻塞主流程。Spring Boot 里头默认就集成了消息队列,用起来贼方便。

1. 消息队列的核心概念

消息队列里头有几个核心概念:生产者(Producer)、消费者(Consumer)、队列(Queue)、交换机(Exchange)。

  • 生产者:就是发送消息的程序。
  • 消费者:就是接收消息的程序。
  • 队列:就是存储消息的地方。
  • 交换机:就是路由消息的地方。

2. RabbitMQ 是啥玩意儿?

RabbitMQ 是一个开源的、高性能的消息队列中间件,支持多种消息协议,比如说 AMQP、STOMP、MQTT 啥的。Spring Boot 里头默认就集成了 RabbitMQ,用起来贼方便。

三、Spring Boot 集成 RabbitMQ

Spring Boot 里头集成 RabbitMQ 很简单,只要加个依赖,配个连接信息就行了。

1. 添加依赖

首先,你得在 pom.xml 里头加个 RabbitMQ 的依赖。

XML Code

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-amqp</artifactId>

</dependency>

这段代码里头,spring-boot-starter-amqp 是 Spring Boot 里头的 RabbitMQ 依赖。

2. 配置连接信息

然后,你得在 application.properties 里头配个 RabbitMQ 的连接信息。

Properties Code

spring.rabbitmq.host=localhost

spring.rabbitmq.port=5672

spring.rabbitmq.username=guest

spring.rabbitmq.password=guest

这段代码里头,spring.rabbitmq.host 是 RabbitMQ 的主机地址,spring.rabbitmq.port 是 RabbitMQ 的端口号,spring.rabbitmq.username 是 RabbitMQ 的用户名,spring.rabbitmq.password 是 RabbitMQ 的密码。

3. 使用 RabbitTemplate

最后,你可以在代码里头用 RabbitTemplate 来发送消息。

Java Code

@Service

public class MyService {

    @Autowired

    private RabbitTemplate rabbitTemplate;

    public void sendMessage(String message) {

        rabbitTemplate.convertAndSend("myQueue", message);

    }

}

这段代码里头,RabbitTemplate 是 Spring Boot 里头的一个类,用来发送消息的。

四、Spring Boot 使用 RabbitMQ 实现异步处理

Spring Boot 里头使用 RabbitMQ 实现异步处理很简单,只要加个注解就行了。

1. 定义队列

首先,你得定义一个队列,用 @Bean 注解标记。

Java Code

@Configuration

public class RabbitMQConfig {

    @Bean

    public Queue myQueue() {

        return new Queue("myQueue");

    }

}

这段代码里头,myQueue 方法定义了一个队列,名字叫 myQueue。

2. 定义消费者

然后,你得定义一个消费者,用 @RabbitListener 注解标记。

Java Code

@Service

public class MyConsumer {

    @RabbitListener(queues = "myQueue")

    public void receiveMessage(String message) {

        System.out.println("收到消息:" + message);

    }

}

这段代码里头,receiveMessage 方法用 @RabbitListener 注解标记了,表示监听 myQueue 队列。

3. 发送消息

最后,你可以在生产者里头发送消息。

Java Code

@Service

public class MyService {

    @Autowired

    private RabbitTemplate rabbitTemplate;

    public void sendMessage(String message) {

        rabbitTemplate.convertAndSend("myQueue", message);

    }

}

这段代码里头,sendMessage 方法用 RabbitTemplate 发送了一条消息到 myQueue 队列。

五、Spring Boot 使用 RabbitMQ 的坑点

1. 消息丢失

RabbitMQ 里头,消息可能会丢失。你要是没处理好,那消息可就没了。

Java Code

@Service

public class MyService {

    @Autowired

    private RabbitTemplate rabbitTemplate;

    public void sendMessage(String message) {

        rabbitTemplate.convertAndSend("myQueue", message, new MessagePostProcessor() {

            @Override

            public Message postProcessMessage(Message message) throws AmqpException {

                message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);

                return message;

            }

        });

    }

}

这段代码里头,setDeliveryMode(MessageDeliveryMode.PERSISTENT) 表示消息持久化,避免消息丢失。

2. 消息重复

RabbitMQ 里头,消息可能会重复。你要是没处理好,那消息可就重复了。

Java Code

@Service

public class MyConsumer {

    @RabbitListener(queues = "myQueue")

    public void receiveMessage(String message, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel) throws IOException {

        System.out.println("收到消息:" + message);

        channel.basicAck(deliveryTag, false);

    }

}

这段代码里头,basicAck(deliveryTag, false) 表示手动确认消息,避免消息重复。

3. 消息堆积

RabbitMQ 里头,消息可能会堆积。你要是没处理好,那消息可就堆积了。

Java Code

@Configuration

public class RabbitMQConfig {

    @Bean

    public Queue myQueue() {

        return new Queue("myQueue", true, false, false, new HashMap<String, Object>() {{

            put("x-max-length", 10000);

        }});

    }

}

这段代码里头,x-max-length 表示队列的最大长度,避免消息堆积。

专有名词解释

  1. 消息队列:系统解耦的一个利器,把一些耗时的操作放到队列里头,让系统慢慢处理。
  2. 生产者:发送消息的程序。
  3. 消费者:接收消息的程序。
  4. 队列:存储消息的地方。
  5. 交换机:路由消息的地方。
  6. RabbitMQ:一个开源的、高性能的消息队列中间件,支持多种消息协议。
  7. RabbitTemplate:Spring Boot 里头的一个类,用来发送消息的。
  8. @RabbitListener:Spring Boot 里头的一个注解,用来监听队列。
  9. MessagePostProcessor:Spring Boot 里头的一个接口,用来处理消息。
  10. MessageDeliveryMode:Spring Boot 里头的一个枚举,用来设置消息的传递模式。
  11. AmqpHeaders.DELIVERY_TAG:Spring Boot 里头的一个常量,用来获取消息的投递标签。
  12. Channel:RabbitMQ 里头的一个接口,用来操作队列。
  13. x-max-length:RabbitMQ 里头的一个参数,用来设置队列的最大长度。

写在最后

身为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),已经在找朋友内测了,比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offer...

我深刻意识到,能自由做自己喜欢的事情是有多么不容易,又是多么有成就感。所以我拉了两三个志同道合的好友,开了一间公司,继续朝着“自由”的目标前进。

当下呢,我们希望有更多的朋友能够参与到产品的测试中来,体验并且给出更好的建议。未来可能会在博客po更多关于我们产品的内容,包括使用场景、说明、课程等,希望能对大家有所帮助。

另外,想整个花活儿,每天花个1-2小时,来帮助我素未谋面的老朋友们看看简历,提提意见啥的,纯属为爱发电。我在线时间不固定,但是不要米,咱就别要自行车儿了呗~如果您有兴趣,可以点击文章底部卡片一起交流(人工回复,比较慢,请担待)。

最后,请大家持续关注我们的博客,未来还有很多栏目,一起发掘~!

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

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

相关文章

DeepSeek分析仿写选题应该怎么做?

目录 选题分析&#xff1a;AIGC在学术写作中的应用及其与作者背景的关系 1. 选题背景与意义 2. 研究问题 3. 研究方法 4. 主要发现 5. 研究贡献 6. 研究局限与未来方向 7. 结论 8. 未来研究方向 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWrit…

19840 Dijkstra求最短路2

19840 Dijkstra求最短路2 相较于1&#xff0c;数据增强了&#xff0c;要用堆来优化&#xff0c;也就是优先队列。 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;Dijkstra、最短路问题 &#x1f4d6; &#x1f4da; import java.util.*;public class Main {static…

Redis-08.Redis常用命令-有序集合操作命令

一.有序集合操作命令 ZADD key score 1 member1 [score2 member2]&#xff1a; zadd zset 10.0 a 10.5 b ZRANGE key start stop [WITHSCORES]: zrange zset 0 -1 为何顺序为a&#xff0c;c&#xff0c;b&#xff1f; 因为 zrange zset 0 -1 withscores zrange key start …

LLaMA-Factory使用实战

LLaMA-Factory使用实战 项目介绍 项目地址&#xff1a;https://github.com/hiyouga/LLaMA-Factory 中文文档&#xff1a;安装 - LLaMA Factory 快速开始文档&#xff1a;https://zhuanlan.zhihu.com/p/695287607&#xff08;推荐参考&#xff09; 远程服务器通过本地代理加…

读一本书,骑行万里路:与维乐 Angel Rise+骑行看世界

最近读到了一本名为《自行车改变的世界&#xff1a;女性骑行的历史》的书&#xff0c;才发现原来女性的骑行自由来得并不轻易&#xff0c;激励着每一位女性勇敢地踏上骑行之路。而我一直在使用的维乐坐垫品牌&#xff0c;除了产品专业之外&#xff0c;也一直都非常关注女性骑行…

【大模型】SpringBoot整合LangChain4j实现RAG检索实战详解

目录 一、前言 二、LangChain4j 介绍 2.1 什么是LangChain4j 2.2 LangChain4j 主要特点 2.3 Langchain4j 核心组件 三、RAG介绍 3.1 什么是RAG 3.2 RAG工作流程 3.2.1 补充说明 3.3 Embedding模型 3.3.1 RAG实际使用步骤 3.3.2 什么是Embedding 3.3.3 Embedding 技…

流动的梦境:GPT-4o 的自回归图像生成深度解析

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

北大人工智能研究院朱松纯:“中国的AI叙事” 存在认知偏差

3月29日&#xff0c;在2025中关村论坛通用人工智能论坛上&#xff0c;北京通用人工智能学院院长&#xff0c;北京大学人工智能研究院、智能学院院长朱松纯表示&#xff0c;目前&#xff0c;行业对AI的讨论几乎被大模型能力所占据&#xff0c;而基础学科、原始创新与智能本质的研…

习题1.26

解释题&#xff0c;说简单也简单&#xff0c;难在如何表达清楚。 首先解释下代码的变化 (defn expmod[base exp m](cond ( exp 0) 1(even? exp) (mod (square (expmod base (/ exp 2) m)) m):else (mod (* base (expmod base (- exp 1) m)) m)))(defn expmod[base exp m](co…

FPGA调试笔记

XILINX SSTL属性电平报错 错误如下&#xff1a; [DRC BIVRU-1] Bank IO standard Vref utilization: Bank 33 contains ports that use a reference voltage. In order to use such standards in a bank that is not configured to use INTERNAL_VREF, the banks VREF pin mu…

基于Java(SSM)+Mysql实现移动大厅业务办理(增删改查)

基于 SSM 框架的移动业务大厅 数据库需要自行创建&#xff01; 一、 整体基本实现情况 对本学期的 Java 作业 1 的 SOSO 移动大厅进行改进&#xff0c; 基于 SSM、JSP、Maven、Tomcat、MySQL 等实现。 二、 实现详情 1、 工程结构图 2、 工程结构各部分实现 &#xff08;…

【字符设备驱动开发–IMX6ULL】(一)简介

【字符设备驱动开发–IMX6ULL】&#xff08;一&#xff09;简介 一、Linux驱动与裸机开发区别 1.裸机驱动开发回顾 ​ 1、底层&#xff0c;跟寄存器打交道&#xff0c;有些MCU提供了库。 spi.c&#xff1a;主机驱动&#xff08;换成任何一个设备之后只需要调用此文件里面的…

C++_STL之list篇

一、list的介绍 std::list是C标准模板库(STL)中的一个双向链表容器。与vector和deque不同&#xff0c;list不支持随机访问&#xff0c;但它在任何位置插入和删除元素都非常高效。 1.基本特性 (1)双向链表结构&#xff1a;每个元素都包含指向前驱和后继的指针 (2)非连续存储&…

Spring 声明式事务 万字详解(通俗易懂)

目录 Δ前言 一、声明式事务快速入门 1.为什么需要声明式事务&#xff1f; 2.定义&#xff1a; 3.应用实例&#xff1a; 二、声明式事务的传播机制 1.引出问题&#xff1a; 2.传播机制分类&#xff1a; 3.应用实例&#xff1a; 三、声明式事务的隔离机制 1.四种隔离级别&…

MySQL 当中的锁

MySQL 当中的锁 文章目录 MySQL 当中的锁MySQL 中有哪些主要类型的锁&#xff1f;请简要说明MySQL 的全局锁有什么用&#xff1f;MySQL 的表级锁有哪些&#xff1f;作用是什么&#xff1f;元数据锁&#xff08;MetaData Lock&#xff0c;MDL&#xff09;意向锁&#xff08;Inte…

[Linux]基础IO

基础IO C文件IO相关操作磁盘文件与内存文件inode&#xff08;index node&#xff09;硬链接与软连接硬链接软连接总结 动静态库静态库动态库总结 C文件IO相关操作 当前路径&#xff1a;进程运行的时候&#xff0c;所处的路径叫做当前路径 打开文件的时候&#xff0c;一定是进…

力扣刷题-热题100题-第27题(c++、python)

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/merge-two-sorted-lists/description/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 创建一个新链表&#xff0c;遍历list1与list2&#xff0c;将新链表指向list1与list2…

Vue3 其它API Teleport 传送门

Vue3 其它API Teleport 传送门 在定义一个模态框时&#xff0c;父组件的filter属性会影响子组件的position属性&#xff0c;导致模态框定位错误使用Teleport解决这个问题把模态框代码传送到body标签下

windows下安装sublime

sublime4 alpha 4098 版本 下载 可以根据待破解的版本选择下载 https://www.sublimetext.com/dev crack alpha4098 的licence 在----- BEGIN LICENSE ----- TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA12C0 A37081C5 D0316412 4584D…

Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器

JVM是Java高级部分&#xff0c;深入理解程序的运行及原理&#xff0c;面试中也问的比较多。 JVM是Java程序运行的虚拟机环境&#xff0c;实现了“一次编写&#xff0c;到处运行”。它负责将字节码解释或编译为机器码&#xff0c;管理内存和资源&#xff0c;并提供运行时环境&a…