Spring Boot 消息队列与异步处理

Spring Boot 消息队列与异步处理

Spring Boot 消息队列与异步处理

在这里插入图片描述
28.1 学习目标与重点提示

学习目标:掌握Spring Boot消息队列与异步处理的核心概念与使用方法,包括消息队列的定义与特点、异步处理的定义与特点、Spring Boot与消息队列的集成、Spring Boot的实际应用场景,学会在实际开发中处理消息队列与异步处理问题。
重点:消息队列的定义与特点异步处理的定义与特点Spring Boot与消息队列的集成Spring Boot的实际应用场景

28.2 消息队列与异步处理概述

消息队列与异步处理是Java开发中的重要组件。

28.2.1 消息队列的定义

定义:消息队列是一种用于在不同应用程序之间传递消息的中间件,允许应用程序异步处理消息。
作用

  • 提高应用程序的性能。
  • 提高应用程序的可靠性。
  • 实现应用程序之间的解耦。

常见的消息队列

  • RabbitMQ:RabbitMQ是一种开源的消息队列。
  • ActiveMQ:ActiveMQ是一种开源的消息队列。
  • Kafka:Kafka是一种开源的消息队列。
  • Redis:Redis是一种开源的内存数据库,支持消息队列。

✅ 结论:消息队列是一种用于在不同应用程序之间传递消息的中间件,作用是提高应用程序的性能、可靠性、实现应用程序之间的解耦。

28.2.2 异步处理的定义

定义:异步处理是指应用程序在处理请求时,不阻塞主线程,而是将请求发送到消息队列,由其他线程或进程处理。
作用

  • 提高应用程序的响应速度。
  • 提高应用程序的吞吐量。
  • 提高应用程序的可扩展性。

✅ 结论:异步处理是指应用程序在处理请求时,不阻塞主线程,作用是提高应用程序的响应速度、吞吐量、可扩展性。

28.3 Spring Boot与消息队列的集成

Spring Boot与消息队列的集成是Java开发中的重要内容。

28.3.1 集成RabbitMQ的步骤

定义:集成RabbitMQ的步骤是指使用Spring Boot与RabbitMQ集成的方法。
步骤

  1. 创建Spring Boot项目。
  2. 添加所需的依赖。
  3. 配置RabbitMQ。
  4. 创建消息生产者。
  5. 创建消息消费者。
  6. 测试应用。

示例
pom.xml文件中的依赖:

<dependencies><!-- Web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- RabbitMQ依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!-- 测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

application.properties文件中的配置:

# 服务器端口 server.port=8080 # RabbitMQ连接信息 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest 

消息生产者类:

importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;@ComponentpublicclassProductMessageProducer{@AutowiredprivateRabbitTemplate rabbitTemplate;privatestaticfinalStringEXCHANGE_NAME="product-exchange";privatestaticfinalStringROUTING_KEY="product-routing-key";publicvoidsendProductMessage(String message){ rabbitTemplate.convertAndSend(EXCHANGE_NAME,ROUTING_KEY, message);System.out.println("消息已发送:"+ message);}}

消息消费者类:

importorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.stereotype.Component;@ComponentpublicclassProductMessageConsumer{@RabbitListener(queues ="product-queue")publicvoidreceiveProductMessage(String message){System.out.println("消息已接收:"+ message);// 处理消息的业务逻辑processProductMessage(message);}privatevoidprocessProductMessage(String message){// 模拟处理消息的业务逻辑try{Thread.sleep(2000);System.out.println("消息处理完成:"+ message);}catch(InterruptedException e){ e.printStackTrace();}}}

RabbitMQ配置类:

importorg.springframework.amqp.core.Binding;importorg.springframework.amqp.core.BindingBuilder;importorg.springframework.amqp.core.DirectExchange;importorg.springframework.amqp.core.Queue;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassRabbitMQConfig{@BeanpublicDirectExchangeproductExchange(){returnnewDirectExchange("product-exchange");}@BeanpublicQueueproductQueue(){returnnewQueue("product-queue");}@BeanpublicBindingproductBinding(Queue productQueue,DirectExchange productExchange){returnBindingBuilder.bind(productQueue).to(productExchange).with("product-routing-key");}}

控制器类:

importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;@RestController@RequestMapping("/api/products")publicclassProductController{@AutowiredprivateProductMessageProducer productMessageProducer;@PostMapping("/send")publicStringsendProductMessage(@RequestBodyString message){ productMessageProducer.sendProductMessage(message);return"消息已发送";}}

应用启动类:

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassRabbitMQApplication{publicstaticvoidmain(String[] args){SpringApplication.run(RabbitMQApplication.class, args);}}

测试类:

importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.boot.test.web.client.TestRestTemplate;importorg.springframework.boot.web.server.LocalServerPort;importstaticorg.assertj.core.api.Assertions.assertThat;@SpringBootTest(webEnvironment =SpringBootTest.WebEnvironment.RANDOM_PORT)classRabbitMQApplicationTests{@LocalServerPortprivateint port;@AutowiredprivateTestRestTemplate restTemplate;@TestvoidcontextLoads(){}@TestvoidtestSendProductMessage(){String message ="Hello, RabbitMQ!";String response = restTemplate.postForObject("http://localhost:"+ port +"/api/products/send", message,String.class);assertThat(response).contains("消息已发送");}}

✅ 结论:集成RabbitMQ的步骤包括创建Spring Boot项目、添加所需的依赖、配置RabbitMQ、创建消息生产者、创建消息消费者、测试应用。

28.4 Spring Boot的实际应用场景

在实际开发中,Spring Boot消息队列与异步处理的应用场景非常广泛,如:

  • 实现产品信息的异步处理。
  • 实现用户信息的异步处理。
  • 实现订单信息的异步处理。
  • 实现支付信息的异步处理。

示例

importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;@ComponentclassProductMessageProducer{@AutowiredprivateRabbitTemplate rabbitTemplate;privatestaticfinalStringEXCHANGE_NAME="product-exchange";privatestaticfinalStringROUTING_KEY="product-routing-key";publicvoidsendProductMessage(String message){ rabbitTemplate.convertAndSend(EXCHANGE_NAME,ROUTING_KEY, message);System.out.println("消息已发送:"+ message);}}importorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.stereotype.Component;@ComponentclassProductMessageConsumer{@RabbitListener(queues ="product-queue")publicvoidreceiveProductMessage(String message){System.out.println("消息已接收:"+ message);processProductMessage(message);}privatevoidprocessProductMessage(String message){try{Thread.sleep(2000);System.out.println("消息处理完成:"+ message);}catch(InterruptedException e){ e.printStackTrace();}}}importorg.springframework.amqp.core.Binding;importorg.springframework.amqp.core.BindingBuilder;importorg.springframework.amqp.core.DirectExchange;importorg.springframework.amqp.core.Queue;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationclassRabbitMQConfig{@BeanpublicDirectExchangeproductExchange(){returnnewDirectExchange("product-exchange");}@BeanpublicQueueproductQueue(){returnnewQueue("product-queue");}@BeanpublicBindingproductBinding(Queue productQueue,DirectExchange productExchange){returnBindingBuilder.bind(productQueue).to(productExchange).with("product-routing-key");}}importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;@RestController@RequestMapping("/api/products")classProductController{@AutowiredprivateProductMessageProducer productMessageProducer;@PostMapping("/send")publicStringsendProductMessage(@RequestBodyString message){ productMessageProducer.sendProductMessage(message);return"消息已发送";}}@SpringBootApplicationpublicclassRabbitMQApplication{publicstaticvoidmain(String[] args){SpringApplication.run(RabbitMQApplication.class, args);}}// 测试类@SpringBootTest(webEnvironment =SpringBootTest.WebEnvironment.RANDOM_PORT)classRabbitMQApplicationTests{@LocalServerPortprivateint port;@AutowiredprivateTestRestTemplate restTemplate;@TestvoidcontextLoads(){}@TestvoidtestSendProductMessage(){String message ="Hello, RabbitMQ!";String response = restTemplate.postForObject("http://localhost:"+ port +"/api/products/send", message,String.class);assertThat(response).contains("消息已发送");}}

输出结果

  • 访问http://localhost:8080/api/products/send,发送消息“Hello, RabbitMQ!”。
  • 控制台输出:消息已发送:Hello, RabbitMQ!。
  • 消费者控制台输出:消息已接收:Hello, RabbitMQ!,2秒后输出:消息处理完成:Hello, RabbitMQ!。

✅ 结论:在实际开发中,Spring Boot消息队列与异步处理的应用场景非常广泛,需要根据实际问题选择合适的消息队列和异步处理方法。

总结

本章我们学习了Spring Boot消息队列与异步处理,包括消息队列的定义与特点、异步处理的定义与特点、Spring Boot与消息队列的集成、Spring Boot的实际应用场景,学会了在实际开发中处理消息队列与异步处理问题。其中,消息队列的定义与特点、异步处理的定义与特点、Spring Boot与消息队列的集成、Spring Boot的实际应用场景是本章的重点内容。从下一章开始,我们将学习Spring Boot的其他组件、微服务等内容。

Read more

【开源解析】基于Python的智能文件备份工具开发实战:从定时备份到托盘监控

【开源解析】基于Python的智能文件备份工具开发实战:从定时备份到托盘监控

📁【开源解析】基于Python的智能文件备份工具开发实战:从定时备份到托盘监控 🌈 个人主页:创客白泽 - ZEEKLOG博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦 概述 在数字化时代,数据备份已成为个人和企业数据管理的重要环节。本文将详细介绍如何使用Python开发一款功能全面的桌面级文件备份工具,该工具不仅支持即时备份,还能实现定时自动备份、增量备份等专业功能,并具备系统托盘驻留能力。通过tkinter+ttkbootstrap构建现代化UI界面,结合pystray实现后台运行,是Python GUI开发的经典案例。 功能亮点 1. 双目录选择:可视化选择源目录和目标目录 2. 三种备份模式: * 立即执行备份 * 每日/每周定时备份 * 精确到分钟的自定义时间备份 3. 增量备份机制:仅复制新增或修改过的文件 4. 实时日志系统:彩色分级日志输出 5. 进度可视化:

By Ne0inhk
Yolo11环境配置win+Python+Anaconda--小白目标检测学习专用(超详细)

Yolo11环境配置win+Python+Anaconda--小白目标检测学习专用(超详细)

本文基于Anaconda和Pycharm已经安装 目录 一、下载Yolo11的源代码 二、部署环境 1.打开Anaconda软件 2.创建环境 3.运行环境 4.安装必要的包 注意:如果你下载包很慢 4.1安装Torch 4.1.1【GPU版本】 4.1.2【CPU版本】 4.2安装其他依赖包 三、运行项目 1.打开项目 2.更换解释器 3.验证运行 四、如何训练以及数据集配置 1.训练代码 2.数据集配置文件的创建 3.训练结果图的参数介绍 4.WiderPerson数据集(附加) 一、下载Yolo11的源代码  1.

By Ne0inhk
Python 实战:Boss 直聘职位信息爬虫开发全解析​

Python 实战:Boss 直聘职位信息爬虫开发全解析​

在求职和职场数据分析场景中,获取结构化的职位信息能为我们提供极大的便利 —— 无论是对比薪资水平、分析行业需求,还是研究企业招聘偏好,都需要可靠的数据源支持。本文将手把手教你用 Python 开发一个 Boss 直聘爬虫,通过监听网络请求的方式高效获取职位数据,并将结果保存为 Excel 文件。 一、开发前准备:环境与工具 在开始编码前,我们需要搭建好开发环境并明确核心依赖库的作用,确保后续开发过程顺畅。 1. 环境要求 * Python 3.8 及以上版本(推荐 3.10,兼容性更好) * 浏览器:Chrome 或 Edge(需与 Chromium 内核驱动版本匹配) 2. 核心依赖库 本文爬虫主要依赖 4 个关键库,可通过pip install 库名命令安装: * DrissionPage:一款强大的浏览器自动化工具,支持控制浏览器、监听网络请求,

By Ne0inhk

PyBind11使用全解析,彻底搞懂C++与Python高效绑定

第一章:PyBind11使用全解析,彻底搞懂C++与Python高效绑定 PyBind11 是一个轻量级的头文件库,能够将 C++ 代码无缝暴露给 Python,实现高性能的跨语言调用。它利用现代 C++(C++11 及以上)特性,在编译期生成高效的绑定代码,相比传统的 SWIG 或 Boost.Python 更加简洁易用。 核心优势与基本结构 * 仅需包含头文件,无需额外链接库 * 支持 STL 容器、智能指针、类继承等复杂类型自动转换 * 编译后模块可直接通过 import 在 Python 中调用 快速入门示例 创建一个简单的 C++ 函数并绑定至 Python: #include <pybind11/pybind11.h> int add(

By Ne0inhk