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

【Linux指南】gcc/g++编译器:从源码到可执行文件的全流程解析

【Linux指南】gcc/g++编译器:从源码到可执行文件的全流程解析

引言 在Linux开发环境中,gcc和g++是最常用的编译器工具,它们承担着将源代码转化为可执行程序的核心任务。其中,gcc专注于C语言程序的编译,而g++则同时支持C和C++语言。理解这两款编译器的工作原理和使用方法,是掌握Linux开发的基础技能。 文章目录 * 引言 * 一、编译的四个核心阶段 * 1. 预处理阶段:代码的初步加工 * 2. 编译阶段:从高级语言到汇编语言 * 3. 汇编阶段:从汇编到二进制目标文件 * 4. 链接阶段:整合目标文件与库 * 二、一次性编译与常用扩展选项 * 三、多文件编译实践 * 四、总结 一、编译的四个核心阶段 从源代码到可执行文件,gcc/g++的工作流程分为四个关键阶段,每个阶段都有明确的输入、输出和任务目标。 四个核心阶段输出输出输出输出**预处理 (gcc -E)** ▸ 宏替换 ▸ 删除注释 ▸ 头文件展开 ▸ 条件编译处理*

By Ne0inhk

Flutter 三方库 jaguar 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、全能的工业级嵌入式 HTTP 服务端框架与 REST API 交互引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 jaguar 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、全能的工业级嵌入式 HTTP 服务端框架与 REST API 交互引擎 在鸿蒙(OpenHarmony)系统的端侧服务器化、分布式设备互联监控、或者是需要将鸿蒙应用转变为一个能够提供 API 服务的微型网关(如鸿蒙版物联网中枢)场景中,如何通过一套 Dart 代码构建出极致稳健、带路由拦截、支持 Session 且完全透明的 HTTP 服务?jaguar 为开发者提供了一套工业级的、基于生产环境优化的服务端处理方案。本文将深入实战其在鸿蒙端侧服务化中的应用。 前言 什么是 Jaguar?它不是一个普通的 HTTP 监听器,而是一个专为“速度”与“扩展性”

By Ne0inhk
鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代优化

鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代优化

《鸿蒙APP开发从入门到精通》第25篇:鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代优化 🚀📱🔧 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第25篇——上线与运维、用户反馈、持续迭代优化篇,100%承接第24篇的生态合作、用户运营优化、数据产品变现优化架构,并基于金融场景的上线与运维、用户反馈、持续迭代优化要求,设计并实现鸿蒙金融理财全栈项目的上线与运维、用户反馈、持续迭代优化功能。 学习目标: * 掌握鸿蒙金融理财项目的上线与运维优化设计与实现; * 实现应用上线优化、应用运维优化、应用监控优化; * 理解用户反馈在金融场景的核心优化设计与实现; * 实现用户反馈收集优化、用户反馈分析优化、用户反馈处理优化; * 掌握持续迭代优化在金融场景的设计与实现; * 实现持续集成优化、持续部署优化、持续交付优化; * 优化金融理财项目的用户体验(上线与运维、用户反馈、持续迭代优化)。 学习重点: * 鸿蒙金融理财项目的上线与运维优化设计原则; * 用户反馈在金融场景的优化应用; * 持续迭代优化在金融场景的设计要点。 一、

By Ne0inhk
AI绘画电商产品提示词撰写指南

AI绘画电商产品提示词撰写指南

在电商领域,利用 AI 绘画生成产品图片正逐渐成为提升商品视觉吸引力、提高运营效率的重要手段。而撰写精准有效的提示词,是让 AI 理解并生成符合预期产品图片的关键。 一、明确产品关键信息 产品基础描述 产品类型与用途:清晰界定产品所属类别,无论是服装、电子产品、家居用品还是美妆产品等,这是 AI理解产品的基础。同时,简要说明产品的核心用途或目标受众,可分为3层结构(按优先级排序) * 基础层:明确产品核心属性(避免 AI 生成偏差),包括「产品类别 + 规格 + 材质 / 工艺」,例: “女士夏季短袖连衣裙(长度到膝盖),雪纺面料,蕾丝领口” * 场景层:搭建使用场景(增强代入感),包括「使用环境 + 搭配元素 + 人群画像」,例: “在海边沙滩场景,搭配草编帽和珍珠凉鞋,适合 25-35

By Ne0inhk