【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的消息队列:使用 RabbitMQ 实现异步处
<前文回顾>
<今日更新>
一、开篇整活儿
今儿个咱唠唠 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 表示队列的最大长度,避免消息堆积。
专有名词解释
- 消息队列:系统解耦的一个利器,把一些耗时的操作放到队列里头,让系统慢慢处理。
- 生产者:发送消息的程序。
- 消费者:接收消息的程序。
- 队列:存储消息的地方。
- 交换机:路由消息的地方。
- RabbitMQ:一个开源的、高性能的消息队列中间件,支持多种消息协议。
- RabbitTemplate:Spring Boot 里头的一个类,用来发送消息的。
- @RabbitListener:Spring Boot 里头的一个注解,用来监听队列。
- MessagePostProcessor:Spring Boot 里头的一个接口,用来处理消息。
- MessageDeliveryMode:Spring Boot 里头的一个枚举,用来设置消息的传递模式。
- AmqpHeaders.DELIVERY_TAG:Spring Boot 里头的一个常量,用来获取消息的投递标签。
- Channel:RabbitMQ 里头的一个接口,用来操作队列。
- x-max-length:RabbitMQ 里头的一个参数,用来设置队列的最大长度。
写在最后
身为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),已经在找朋友内测了,比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offer...
我深刻意识到,能自由做自己喜欢的事情是有多么不容易,又是多么有成就感。所以我拉了两三个志同道合的好友,开了一间公司,继续朝着“自由”的目标前进。
当下呢,我们希望有更多的朋友能够参与到产品的测试中来,体验并且给出更好的建议。未来可能会在博客po更多关于我们产品的内容,包括使用场景、说明、课程等,希望能对大家有所帮助。
另外,想整个花活儿,每天花个1-2小时,来帮助我素未谋面的老朋友们看看简历,提提意见啥的,纯属为爱发电。我在线时间不固定,但是不要米,咱就别要自行车儿了呗~如果您有兴趣,可以点击文章底部卡片一起交流(人工回复,比较慢,请担待)。
最后,请大家持续关注我们的博客,未来还有很多栏目,一起发掘~!
相关文章:
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的消息队列:使用 RabbitMQ 实现异步处
<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…...
高项第十六章——项目采购管理
什么是采购管理?项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。 项目采购管理包括编制和管理协议所需的管理和控制过程。 16_1 管理基础 什么是协议?协议是用于明确项目初步意向的任何文件或沟通结果,协议的范…...
宽带的带宽
宽带的带宽是指在一定时间内通过网络连接传输数据的能力,通常用**比特率(bit/s,即每秒传输的比特数)**来表示,比如100Mbps(兆比特每秒)。带宽越大,理论上网络传输数据的速度越快&…...
DeepSeek分析仿写选题应该怎么做?
目录 选题分析:AIGC在学术写作中的应用及其与作者背景的关系 1. 选题背景与意义 2. 研究问题 3. 研究方法 4. 主要发现 5. 研究贡献 6. 研究局限与未来方向 7. 结论 8. 未来研究方向 大家好这里是AIWritePaper官方账号,官网👉AIWrit…...
19840 Dijkstra求最短路2
19840 Dijkstra求最短路2 相较于1,数据增强了,要用堆来优化,也就是优先队列。 ⭐️难度:中等 🌟考点:Dijkstra、最短路问题 📖 📚 import java.util.*;public class Main {static…...
docker-compose部署prometheus+grafana+node_exporter
目录 docker-compose文件 配置文件 文件层级关系,docker-compose和配置文件位于同级目录 node_exporter页面json文件 涉及离线包 一.docker-compose文件 [rootsulibao prometheus]# cat docker-compose.yml version: 3services:prometheus:image: registry.c…...
Oracle数据库数据编程SQL<递归函数详解>
递归函数是一种在函数体内直接或间接调用自身的函数。这种函数通过将复杂问题分解为更小的相同问题来解决特定类型的编程任务。 目录 一、递归函数基本概念 1. 递归定义 2. 递归工作原理 二、递归函数示例 1. 经典阶乘函数 2. 斐波那契数列 3. 计算数字位数 三、递归查…...
Redis-08.Redis常用命令-有序集合操作命令
一.有序集合操作命令 ZADD key score 1 member1 [score2 member2]: zadd zset 10.0 a 10.5 b ZRANGE key start stop [WITHSCORES]: zrange zset 0 -1 为何顺序为a,c,b? 因为 zrange zset 0 -1 withscores zrange key start …...
LLaMA-Factory使用实战
LLaMA-Factory使用实战 项目介绍 项目地址:https://github.com/hiyouga/LLaMA-Factory 中文文档:安装 - LLaMA Factory 快速开始文档:https://zhuanlan.zhihu.com/p/695287607(推荐参考) 远程服务器通过本地代理加…...
读一本书,骑行万里路:与维乐 Angel Rise+骑行看世界
最近读到了一本名为《自行车改变的世界:女性骑行的历史》的书,才发现原来女性的骑行自由来得并不轻易,激励着每一位女性勇敢地踏上骑行之路。而我一直在使用的维乐坐垫品牌,除了产品专业之外,也一直都非常关注女性骑行…...
【大模型】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热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
北大人工智能研究院朱松纯:“中国的AI叙事” 存在认知偏差
3月29日,在2025中关村论坛通用人工智能论坛上,北京通用人工智能学院院长,北京大学人工智能研究院、智能学院院长朱松纯表示,目前,行业对AI的讨论几乎被大模型能力所占据,而基础学科、原始创新与智能本质的研…...
习题1.26
解释题,说简单也简单,难在如何表达清楚。 首先解释下代码的变化 (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属性电平报错 错误如下: [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 框架的移动业务大厅 数据库需要自行创建! 一、 整体基本实现情况 对本学期的 Java 作业 1 的 SOSO 移动大厅进行改进, 基于 SSM、JSP、Maven、Tomcat、MySQL 等实现。 二、 实现详情 1、 工程结构图 2、 工程结构各部分实现 (…...
音视频 ColorSpace色彩空间详解
前言 基于前篇介绍YUV格式,本文继续介绍另一个重要概念颜色空间,又叫色彩空间;主要用于在音视频开发中的色彩空间转换。 色彩空间Color Space 色彩空间由色彩模型和色域共同定义。当色彩模型与特定的描述相关联以后,就称为色彩空间。 色彩模型Color Model 色彩模型Col…...
【字符设备驱动开发–IMX6ULL】(一)简介
【字符设备驱动开发–IMX6ULL】(一)简介 一、Linux驱动与裸机开发区别 1.裸机驱动开发回顾 1、底层,跟寄存器打交道,有些MCU提供了库。 spi.c:主机驱动(换成任何一个设备之后只需要调用此文件里面的…...
45 55跳跃游戏解题记录
先是55跳跃游戏,暴力解法会怎样?会超出时间限制,而且有很多细节要注意: func canJump(nums []int) bool {// 处理空数组情况,当nums只剩一个元素时,nums[i:]导致越界。if len(nums) 0 {return false}// 如…...
C++_STL之list篇
一、list的介绍 std::list是C标准模板库(STL)中的一个双向链表容器。与vector和deque不同,list不支持随机访问,但它在任何位置插入和删除元素都非常高效。 1.基本特性 (1)双向链表结构:每个元素都包含指向前驱和后继的指针 (2)非连续存储&…...
Go中的逃逸分析
什么是逃逸? 逃逸是指一个变量本来应该分配在栈(stack)上,但由于某些原因,最终被分配到了堆(heap)上。 类比: 栈就像一个临时的快餐盒,用来存放短期使用的数据。堆就像…...
Spring 声明式事务 万字详解(通俗易懂)
目录 Δ前言 一、声明式事务快速入门 1.为什么需要声明式事务? 2.定义: 3.应用实例: 二、声明式事务的传播机制 1.引出问题: 2.传播机制分类: 3.应用实例: 三、声明式事务的隔离机制 1.四种隔离级别&…...
MySQL 当中的锁
MySQL 当中的锁 文章目录 MySQL 当中的锁MySQL 中有哪些主要类型的锁?请简要说明MySQL 的全局锁有什么用?MySQL 的表级锁有哪些?作用是什么?元数据锁(MetaData Lock,MDL)意向锁(Inte…...
fyrox 2D和3D游戏的制作
目录 fyrox介绍 1. 核心特性 1.1 高性能渲染 1.2 跨平台支持 1.3 物理引擎集成 1.4 脚本系统 1.5 场景管理 2. 架构设计 2.1 渲染器 2.2 资源管理器 2.3 输入系统 2.4 音频引擎 2.5 网络模块 3. 使用场景 3.1 2D游戏 3.2 3D游戏 3.3 模拟与教育应用 4. 在游戏…...
[Linux]基础IO
基础IO C文件IO相关操作磁盘文件与内存文件inode(index node)硬链接与软连接硬链接软连接总结 动静态库静态库动态库总结 C文件IO相关操作 当前路径:进程运行的时候,所处的路径叫做当前路径 打开文件的时候,一定是进…...
力扣刷题-热题100题-第27题(c++、python)
21. 合并两个有序链表 - 力扣(LeetCode)https://leetcode.cn/problems/merge-two-sorted-lists/description/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 创建一个新链表,遍历list1与list2,将新链表指向list1与list2…...
Vue3 其它API Teleport 传送门
Vue3 其它API Teleport 传送门 在定义一个模态框时,父组件的filter属性会影响子组件的position属性,导致模态框定位错误使用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…...
golang 的strconv包常用方法
目录 1. 字符串与整数的转换 2. 字符串与浮点数的转换 3. 布尔值的转换 4. 字符串的转义 5. 补充:rune 类型的使用 方法功能详解 代码示例: 1. 字符串与整数的转换 方法名称功能描述示例Atoi将字符串转换为十进制整数。strconv.Atoi("123&q…...
ComplexE的代码注释
目录 dataloader.pymodel.pyrun.py 先安装软件,配置环境,搞了一周。再看代码写注释搞了一周。中间隔了一周。再安装环境跑代码又一周。最后结果是没结果。自己电脑内存带不动。还不想配电脑,又不会用GPU服务器。哭死哭死。心态崩了。直接发吧…...
