Spring Boot中如何实现异步处理

在 Spring Boot 中实现异步处理可以通过使用 @Async 注解和 @EnableAsync 注解来实现。以下是如何配置和使用异步处理的步骤和示例代码。

步骤:

  1. 启用异步支持: 在 Spring Boot 配置类上使用 @EnableAsync 注解启用异步处理。
  2. 使用 @Async 注解异步方法: 在需要异步执行的方法上使用 @Async 注解。
  3. 返回 FutureCompletableFutureListenableFuture: 异步方法可以返回 FutureCompletableFutureListenableFuture 类型的对象,这样可以获取异步执行结果。

示例代码:

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 时,任务会在后台执行,返回消息表示任务已启动。

注意事项:

  1. 异步方法必须运行在 Spring 管理的 Bean 上(如 @Service@Component 注解的类)。
  2. @Async 注解的异步方法不能调用自身,因为 Spring AOP 代理机制只会代理不同类之间的调用。
  3. 如果异步方法抛出异常,默认情况下,异常不会被抛出到调用者。你可以使用 CompletableFutureFuture 来捕获异步结果和异常。

这样就实现了一个基本的 Spring Boot 异步处理功能。

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

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

相关文章

HTML<hgroup>标签

例子&#xff1a; 使用hgroup元素标记标题和段落是相关的&#xff1a; <hgroup> <h2>Norway</h2> <p>The land with the midnight sun.</p> </hgroup> 定义和用法&#xff1a; 标签<hgroup>用于包围标题和一个或多个<p&g…

人工智能在医疗领域的应用与挑战

人工智能在医疗领域的应用与挑战 摘要&#xff1a;本文深入探讨了人工智能在医疗领域的应用现状&#xff0c;分析了其在疾病诊断、药物研发、医疗影像分析等方面的显著成果&#xff0c;同时也剖析了人工智能在医疗应用中面临的数据隐私、伦理道德、技术可靠性等挑战&#xff0…

JavaScript 验证 API:全面解析与实战指南

JavaScript 验证 API:全面解析与实战指南 引言 随着互联网技术的不断发展,前端开发领域的重要性日益凸显。JavaScript 作为前端开发的核心技术之一,其功能性和可扩展性得到了广泛关注。验证功能是JavaScript中不可或缺的一部分,它保证了用户输入数据的正确性和有效性。本…

web端ActiveMq测试工具

如何用vue3创建简单的web端ActiveMq测试工具&#xff1f; 1、复用vue3模板框架 创建main.js,引入APP文件&#xff0c;createApp创建文件&#xff0c;并加载element插件&#xff0c;然后挂载dom节点 2、配置vue.config.js脚本配置 mport { defineConfig } from "vite&qu…

3.DrawCall的概念

DrawCall是渲染管线中的一个重要概念&#xff0c;指的是CPU向GPU发送的一个绘制命令&#xff0c;告诉GPU&#xff1a;“请根据我提供的数据&#xff0c;画一个物体&#xff08;或一部分物体&#xff09;。” 通俗易懂讲解&#xff1a;DrawCall就像给画师下订单 想象你是一个老…

低代码系统-产品架构案例介绍、简道云(七)

今天分析另外一个零代码、低代码产品-简道云&#xff0c;跟所有低代码产品的架构图一样&#xff0c;高、大、炫、美。 依然是从下至上&#xff0c;从左到右的顺序。 开发层 搭建中心 表单、流程、报表、用户中心&#xff0c;还是这些内容&#xff0c;自定义打印很多平台都有&am…

【Oracle篇】使用Hint对优化器的执行计划进行干预(含单表、多表、查询块、声明四大类Hint干预)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…

C# lock使用的逻辑和情景

情景&#xff1a;扣库存&#xff0c;会出现超扣的情况&#xff0c;因为同一个单子会有不同的工作人员使用&#xff0c;要保证数据的一致性。那么就用锁。 优化锁对象管理 使用 Lazy 初始化锁对象&#xff1a; 使用 ConcurrentDictionary 的 GetOrAdd 方法结合 Lazy 确保锁对象只…

LabVIEW项目中的工控机与普通电脑选择

工控机&#xff08;Industrial PC&#xff09;与普通电脑在硬件设计、性能要求、稳定性、环境适应性等方面存在显著差异。了解这些区别对于在LabVIEW项目中选择合适的硬件至关重要。下面将详细分析这两种设备的主要差异&#xff0c;并为LabVIEW项目中的选择提供指导。 ​ 硬件设…

未初始化数据恢复全攻略

没有初始化概述 在日常使用电脑、硬盘、U盘等存储设备时&#xff0c;我们可能会遇到“没有初始化”的提示。这一情况通常发生在存储设备突然无法被系统正常识别或访问时&#xff0c;系统往往要求我们先进行初始化操作。然而&#xff0c;初始化操作意味着对存储设备进行格式化&…

Vue.js组件开发-如何实现全选反选

在 Vue.js 中实现全选和反选功能&#xff0c;可以通过结合v-model、计算属性和事件处理来完成。 实现思路 • 数据绑定&#xff1a;为每个复选框绑定一个选中状态。 • 全选控制&#xff1a;通过一个复选框控制所有复选框的选中状态。 • 反选控制&#xff1a;通过一个按钮或…

Mybatis——sql映射文件中的增删查改

映射文件内的增删查改 准备工作 准备一张数据表&#xff0c;用于进行数据库的相关操作。新建maven工程&#xff0c; 导入mysql-connector-java和mybatis依赖。新建一个实体类&#xff0c;类的字段要和数据表的数据对应编写接口编写mybatis主配置文件 public class User {priva…

Spring MVC (三) —— 实战演练

项目设计 我们会将前端的代码放入 static 包下&#xff1a; 高内聚&#xff0c;低耦合 这是我们在实现项目的设计思想&#xff0c;一个项目里存在很多个模块&#xff0c;每一个模块内部的要求类与类、方法与方法要相互配合紧密联系&#xff0c;这就是高内聚&#xff0c;低耦合…

Typescript泛型类详细解读

代码示例 (() > {// 定义一个类,类中的属性值的类型是不确定,方法中的参数及返回值的类型也是不确定// 定义一个泛型类class GenericNumber<T>{// 默认的属性的值的类型是泛型类型defaultValue: Tadd: (x: T, y: T) > Tconstructor(defaultValue: T) {this.defaul…

OpenCV:图像处理中的低通滤波

目录 简述 什么是低通滤波&#xff1f; 各种滤波器简介与实现 方盒滤波 均值滤波 中值滤波 高斯滤波 双边滤波 各种滤波的对比与应用场景 相关阅读 OpenCV基础&#xff1a;图像变换-CSDN博客 OpenCV&#xff1a;图像滤波、卷积与卷积核-CSDN博客 简述 低通滤波是一…

Vivado生成X1或X4位宽mcs文件并固化到flash

1.生成mcs文件 01.在vivado里的菜单栏选择"tools"工具栏 02.在"tools"里选择"生成内存配置文件" 03.配置参数 按照FPGA板上的flash型号进行选型&#xff0c;相关配置步骤可参考下图。 注意&#xff1a;Flash数据传输位宽如果需要选择X4位宽&am…

rust学习-rust中的保留字

rust学习-rust中的保留字 已使用的保留字未来可能使用的保留字 保留字是语言中预定义的标识符&#xff0c;不能用作变量名、函数名或其他自定义标识符&#xff0c;Rust的保留字大致可以分为两类&#xff1a;已使用的保留字和未来可能使用的保留字 已使用的保留字 as&#xff1…

【第七天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-一种常见的分治算法(持续更新)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Python数据结构与算法的详细介绍1.Python中的常用的分治算法2. 分治算法3.详细的分治代码1&#xff09;一种常见的分治算法 总结 前言 提示&#xff1a;这…

奖励模型:解析大语言模型的关键工具

标题&#xff1a;奖励模型&#xff1a;解析大语言模型的关键工具 文章信息摘要&#xff1a; 奖励模型是理解和审核大语言模型(LLM)的重要工具&#xff0c;通过简单的评估方式提供了模型内部表征和性能的深入洞察。它不仅能静态比较模型表现&#xff0c;还可帮助诊断训练问题&a…

[Linux]el8安全配置faillock:登录失败达阈值自动锁定账户配置

前言 本篇文章的配置仅使用于el8版本的Linux&#xff0c;目前已在centos8、BCLinux8上验证成功&#xff0c;其他版本系统是否可行还得考查。 el8中管理用户登录失败锁定账户所用的模块是faillock.so&#xff0c;如果想要将配置应用与其他版本的Linux&#xff0c;建议确认Linux…