Spring Boot中如何实现异步处理
在 Spring Boot 中实现异步处理可以通过使用 @Async 注解和 @EnableAsync 注解来实现。以下是如何配置和使用异步处理的步骤和示例代码。
步骤:
- 启用异步支持: 在 Spring Boot 配置类上使用
@EnableAsync注解启用异步处理。 - 使用
@Async注解异步方法: 在需要异步执行的方法上使用@Async注解。 - 返回
Future、CompletableFuture或ListenableFuture: 异步方法可以返回Future、CompletableFuture或ListenableFuture类型的对象,这样可以获取异步执行结果。
示例代码:
1. 启用异步处理
首先,在 Spring Boot 的配置类(通常是主类)上添加 @EnableAsync 注解,启用异步处理。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication
@EnableAsync // 启用异步处理
public class AsyncApplication {public static void main(String[] args) {SpringApplication.run(AsyncApplication.class, args);}
}
2. 创建异步服务
接下来,创建一个服务类,其中的方法使用 @Async 注解进行异步处理。
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;import java.util.concurrent.CompletableFuture;@Service
public class AsyncService {// 异步方法,返回一个 CompletableFuture@Asyncpublic CompletableFuture<String> processAsyncTask() throws InterruptedException {// 模拟长时间运行的任务Thread.sleep(3000); // 3秒钟延迟return CompletableFuture.completedFuture("Task completed");}// 异步方法,返回一个简单的结果@Asyncpublic void processVoidAsyncTask() throws InterruptedException {// 模拟长时间运行的任务Thread.sleep(2000); // 2秒钟延迟System.out.println("Void task completed");}
}
3. 在控制器中调用异步服务
在控制器类中,你可以调用这些异步方法。异步方法会在后台线程执行,不会阻塞主线程。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.ExecutionException;@RestController
public class AsyncController {@Autowiredprivate AsyncService asyncService;@GetMapping("/async-task")public String executeAsyncTask() throws InterruptedException, ExecutionException {// 调用异步方法CompletableFuture<String> result = asyncService.processAsyncTask();// 返回异步方法执行结果return result.get(); // 这里会阻塞直到任务完成}@GetMapping("/async-void-task")public String executeVoidAsyncTask() throws InterruptedException {// 调用无返回值的异步方法asyncService.processVoidAsyncTask();return "Void async task initiated";}
}
4. 配置线程池(可选)
默认情况下,Spring Boot 会为异步方法使用一个简单的线程池。如果你需要自定义线程池配置,可以通过以下方式进行配置:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration
@EnableAsync
public class AsyncConfig {@Beanpublic Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5); // 核心线程数executor.setMaxPoolSize(10); // 最大线程数executor.setQueueCapacity(25); // 队列容量executor.setThreadNamePrefix("Async-Executor-");executor.initialize();return executor;}
}
5. 运行和测试
现在,启动你的 Spring Boot 应用,并访问以下 URL 进行测试:
- 访问
/async-task会触发一个异步任务,任务完成后返回结果。 - 访问
/async-void-task会触发一个没有返回值的异步任务,控制台会打印相应的输出。
结果:
- 当你访问
/async-task时,后台将异步处理processAsyncTask方法,主线程不会被阻塞,直到异步任务完成。 - 访问
/async-void-task时,任务会在后台执行,返回消息表示任务已启动。
注意事项:
- 异步方法必须运行在 Spring 管理的 Bean 上(如
@Service或@Component注解的类)。 @Async注解的异步方法不能调用自身,因为 Spring AOP 代理机制只会代理不同类之间的调用。- 如果异步方法抛出异常,默认情况下,异常不会被抛出到调用者。你可以使用
CompletableFuture或Future来捕获异步结果和异常。
这样就实现了一个基本的 Spring Boot 异步处理功能。
相关文章:
Spring Boot中如何实现异步处理
在 Spring Boot 中实现异步处理可以通过使用 Async 注解和 EnableAsync 注解来实现。以下是如何配置和使用异步处理的步骤和示例代码。 步骤: 启用异步支持: 在 Spring Boot 配置类上使用 EnableAsync 注解启用异步处理。使用 Async 注解异步方法&…...
微信小程序怎么制作自己的小程序?手把手带你入门(适合新手小白观看)
对于初学者来说,制作一款微信小程序总感觉高大上,又害怕学不会。不过,今天我就用最简单、最有耐心的方式,一步一步给大家讲清楚!让你知道微信小程序的制作,居然可以这么轻松(希望你别吓跑啊!)。文中还加了实战经验&…...
Vuex 的核心概念:State, Mutations, Actions, Getters
Vuex 的核心概念:State, Mutations, Actions, Getters Vuex 是 Vue.js 的官方状态管理库,提供了集中式的状态管理机制。它的核心概念包括 State(状态)、Mutations(变更)、Actions(动作…...
Python OrderedDict 实现 Least Recently used(LRU)缓存
OrderedDict 实现 Least Recently used(LRU)缓存 引言正文 引言 LRU 缓存是一种缓存替换策略,当缓存空间不足时,会移除最久未使用的数据以腾出空间存放新的数据。LRU 缓存的特点: 有限容量:缓存拥有固定的…...
3.3 Go函数可变参数
可变参数(variadic parameters)是一种允许函数接受任意数量参数的机制。它在函数定义中使用 ...type 来声明参数类型,所有传递的参数会被收集为一个切片,函数内部可以像操作普通切片一样处理这些参数。 package mainimport "…...
EventBus事件总线的使用以及优缺点
EventBus EventBus (事件总线)是一种组件通信方法,基于发布/订阅模式,能够实现业务代码解耦,提高开发效率 发布/订阅模式 发布/订阅模式是一种设计模式,当一个对象的状态发生变化时,所有依赖…...
vim如何设置自动缩进
:set autoindent 设置自动缩进 :set noautoindent 取消自动缩进 (vim如何使设置自动缩进永久生效:vim如何使相关设置永久生效-CSDN博客)...
LongLoRA:高效扩展大语言模型上下文长度的微调方法
论文地址:https://arxiv.org/abs/2309.12307 github地址:https://github.com/dvlab-research/LongLoRA 1. 背景与挑战 大语言模型(LLMs)通常在预定义的上下文长度下进行训练,例如 LLaMA 的 2048 个 token 和 Llama2 的…...
NoSQL使用详解
文章目录 NoSQL使用详解一、引言二、NoSQL数据库的基本概念三、NoSQL数据库的分类及使用场景1. 键值存储数据库示例代码(Redis): 2. 文档存储数据库示例代码(MongoDB): 3. 列存储数据库4. 图数据库 四、使用…...
《FreqMamba: 从频率角度审视图像去雨问题》学习笔记
paper:FreqMamba: Viewing Mamba from a Frequency Perspective for Image Deraining GitHub:GitHub - aSleepyTree/FreqMamba 目录 摘要 1、介绍 2、相关工作 2.1 图像去雨 2.2 频率分析 2.3 状态空间模型 3、方法 3.1 动机 3.2 预备知识 3…...
试用ChatGPT开发一个大语言模型聊天App
参考官方文档,安装android studio https://developer.android.com/studio/install?hlzh-cn 参考这个添加permission权限: https://blog.csdn.net/qingye_love/article/details/14452863 参考下面链接完成Android Studio 给项目添加 gradle 依赖 ht…...
第30周:文献阅读
目录 摘要 Abstract 文献阅读 问题引入 方法论 堆叠集成模型 深度学习模型 创新点 堆叠模型 敏感性和不确定性分析 优化模型 实验研究 数据集 水质指数WQI的计算 模型的构建与训练 模型性能评估 敏感性和不确定性分析 结论 摘要 本文聚焦于利用深度学习算…...
The just sharing principle: advice for advice givers
原文 A while ago I wrote about how Only you know what’s best for your application. That’s because only you fully understand the context within which you are making technical decisions. Any advice need to filtered through that context in order to determi…...
【PVE】PVE部署磁盘阵列
什么是磁盘阵列? 磁盘阵列是一种存储技术,通过将多个物理磁盘组合成一个逻辑存储单元,提供数据冗余和/或性能提升。它的核心目的是提高数据的可靠性、可用性和访问速度。磁盘阵列可以由专用硬件或软件实现。 PVE部署磁盘阵列并加入虚拟机 …...
实战Linux Swap扩展分区
文章目录 定义命令格式案例注释 定义 Swap分区是Linux系统中的一种虚拟内存实现方式,它是磁盘上预留的专用区域。当系统的物理内存不足时,会将部分不活跃的数据从物理内存移动到Swap分区,从而释放更多可用内存空间。 命令格式 关闭Swap分区…...
FlinkSql使用中rank/dense_rank函数报错空指针
问题描述 在flink1.16(甚至以前的版本)中,使用rank()或者dense_rank()进行排序时,某些场景会导致报错空指针NPE(NullPointerError) 报错内容如下 该报错没有行号/错误位置,无法排查 现状 目前已经确认为bug,根据github上的PR日…...
AF3 AtomAttentionDecoder类源码解读
AlphaFold3的AtomAttentionDecoder类旨在从每个 token 的表示扩展到每个原子的表示,同时通过交叉注意力机制对原子及其对关系进行建模。这种设计可以在生物分子建模中捕获复杂的原子级别交互。 源代码: class AtomAttentionDecoder(nn.Module):"""AtomAtten…...
Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat
目录 ?编辑 一、Ubuntu22.04介绍 二、Ubuntu与Centos的区别 三、基于VMware安装Ubuntu Server 22.04 下载 VMware安装 1.创建新的虚拟机 2.选择类型配置 3.虚拟机硬件兼容性 4.安装客户机操作系统 5.选择客户机操作系统 6.命名虚拟机 7.处理器配置 8.虚拟机内存…...
一个基于Python+Appium的手机自动化项目~~
本项目通过PythonAppium实现了抖音手机店铺的自动化询价,可以直接输出excel,并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode: 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目,实现了…...
ubuntu 更新24LTS中断导致“系统出错且无法恢复,请联系系统管理员”
22LTS to 24LTS 更新过程中手jian把更新程序controlC导致的。 解决 目前企图完成更新来恢复,重启后有软件包冲突,sudo apt upgrade报冲突。无法进行。 将原来source.list重新 sudo dpkg --configure -a sudo apt install -f 这些都不管用。还是显示gno…...
(2025,DeepSeek-R1-Zero,DeepSeek-R1,两阶段强化学习,两阶段监督微调,蒸馏,冷启动数据)通过强化学习激励 LLM 的推理能力
DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 目录 0. 摘要 1. 简介 1.1 贡献 1.2 评测结果总结 2. 方法 2.1 概述 2.2 DeepSeek-R1-Zero:基础模型上的强化学习 2.2.1. 强化学习算法 2.2.2. 奖励建模 2.2.3. 训练…...
k8s支持自定义field-selector spec.hostNetwork过滤
好久没写博客啦,年前写一个博客就算混过去啦😂 写一个小功能,对于 Pod,在没有 label 的情况下,支持 --field-selector spec.hostNetwork 查询 Pod 是否为 hostNetwork 类型,只为了熟悉 APIServer 是如何构…...
图漾相机搭配VisionPro使用简易教程
1.下载并安装VisionPro软件 请自行下载VisonPro软件。 VisionPro 9.0/9.5/9.6版本经测试,可正常打开图漾相机,建议使用图漾测试过的版本。 2.下载PercipioCameraForVisionPro软件包 使用浏览器下载:https://gitee.com/percipioxyz/camport3…...
【MFC】C++所有控件随窗口大小全自动等比例缩放源码(控件内字体、列宽等未调整) 20250124
MFC界面全自动等比例缩放 1.在初始化里 枚举每个控件记录所有控件rect 2.在OnSize里,根据当前窗口和之前保存的窗口的宽高求比例x、y 3.枚举每个控件,根据比例x、y调整控件上下左右,并移动到新rect struct ControlInfo {CWnd* pControl;CRect original…...
【2024年华为OD机试】 (C卷,200分)- 机器人走迷宫(JavaScriptJava PythonC/C++)
一、问题描述 题目描述 房间由X * Y的方格组成,每个方格用坐标(x, y)描述。机器人从(0, 0)出发,只能向东或向北前进,出口在(X-1, Y-1)。房间中有一些墙壁,机器人不能经过。有些方格是陷阱(B),…...
DAY01 面向对象回顾、继承、抽象类
学习目标 能够写出类的继承格式public class 子类 extends 父类{}public class Cat extends Animal{} 能够说出继承的特点子类继承父类,就会自动拥有父类非私有的成员 能够说出子类调用父类的成员特点1.子类有使用子类自己的2.子类没有使用,继承自父类的3.子类父类都没有编译报…...
Leetcode — 罗马数字转整数
Leetcode — 罗马数字转整数 文章目录 Leetcode — 罗马数字转整数前言题目示例 1:示例 2:示例 3:示例 4:示例 5:提示: 实现CCJava 前言 虽入大厂好多年,但算法不刷还是不会。人到中年…...
leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先
(一)问题描述 236. 二叉树的最近公共祖先 - 力扣(LeetCode)236. 二叉树的最近公共祖先 - 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科 [https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B…...
PyTorch入门 - 为什么选择PyTorch?
PyTorch入门 - 为什么选择PyTorch? Entry to PyTorch - Why PyTorch? by JacksonML $ pip install pytorch安装完毕后,可以使用以下命令,导入第三方库。 $ import pytorch...
kafka-保姆级配置说明(consumer)
bootstrap.servers #deserializer应该与producer保持对应 #key.deserializer #value.deserializer ##fetch请求返回时,至少获取的字节数,默认值为1 ##当数据量不足时,客户端请求将会阻塞 ##此值越大,客户端请求阻塞的时间越长&…...
