当前位置: 首页 > news >正文

Spring Boot 实现异步处理多个并行任务

在现代Web应用开发中,异步处理和多任务并行处理对于提高系统的响应性和吞吐量至关重要。Spring Boot 提供了多种机制来实现异步任务处理,本文将介绍如何利用这些机制来优化您的应用程序性能。

1. 引言

在高负载情况下,如果所有的请求都采用同步处理的方式,则可能会导致系统响应缓慢甚至超时。为了避免这种情况,我们可以使用异步处理技术来提高应用程序的效率。Spring Boot 提供了简单而强大的工具来支持异步任务处理。

2. 环境准备

确保您的开发环境已安装以下软件:

  • Java 11 或更高版本
  • Maven 3.6 或更高版本
  • Spring Boot 2.x 或更高版本

3. 创建 Spring Boot 项目

首先,我们需要创建一个新的 Spring Boot 项目。可以通过 Spring Initializr 快速生成基本的项目骨架。

3.1 添加依赖

pom.xml 文件中添加必要的依赖,如 spring-boot-starter-webspring-boot-starter-aop(用于支持 @Async 注解)。

 

xml

深色版本

1<dependencies>
2    <dependency>
3        <groupId>org.springframework.boot</groupId>
4        <artifactId>spring-boot-starter-web</artifactId>
5    </dependency>
6    <dependency>
7        <groupId>org.springframework.boot</groupId>
8        <artifactId>spring-boot-starter-aop</artifactId>
9    </dependency>
10</dependencies>

3.2 启用异步支持

在主类上添加 @EnableAsync 注解,以启用异步支持。

 

java

深色版本

1import org.springframework.boot.SpringApplication;
2import org.springframework.boot.autoconfigure.SpringBootApplication;
3import org.springframework.scheduling.annotation.EnableAsync;
4
5@SpringBootApplication
6@EnableAsync
7public class AsyncApplication {
8    public static void main(String[] args) {
9        SpringApplication.run(AsyncApplication.class, args);
10    }
11}

4. 配置线程池

为了更好地控制异步任务的执行,我们通常会自定义一个线程池。

 

java

深色版本

1import org.springframework.context.annotation.Bean;
2import org.springframework.context.annotation.Configuration;
3import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
4
5@Configuration
6public class AsyncConfig {
7
8    @Bean("asyncExecutor")
9    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
10        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
11        executor.setCorePoolSize(2); // 核心线程数
12        executor.setMaxPoolSize(5); // 最大线程数
13        executor.setQueueCapacity(10); // 队列大小
14        executor.setThreadNamePrefix("AsyncExecutor-"); // 线程名称前缀
15        executor.initialize();
16        return executor;
17    }
18}

5. 创建异步服务

接下来,我们将创建一些异步服务方法,并使用 @Async 注解标记它们。

 

java

深色版本

1import org.springframework.scheduling.annotation.Async;
2import org.springframework.stereotype.Service;
3
4import java.util.concurrent.CompletableFuture;
5
6@Service
7public class AsyncService {
8
9    @Async("asyncExecutor")
10    public CompletableFuture<Void> performTaskOne() {
11        System.out.println("Executing task one in " + Thread.currentThread().getName());
12        try {
13            Thread.sleep(2000);
14        } catch (InterruptedException e) {
15            throw new IllegalStateException(e);
16        }
17        return CompletableFuture.completedFuture(null);
18    }
19
20    @Async("asyncExecutor")
21    public CompletableFuture<Void> performTaskTwo() {
22        System.out.println("Executing task two in " + Thread.currentThread().getName());
23        try {
24            Thread.sleep(3000);
25        } catch (InterruptedException e) {
26            throw new IllegalStateException(e);
27        }
28        return CompletableFuture.completedFuture(null);
29    }
30
31    @Async("asyncExecutor")
32    public CompletableFuture<Void> performTaskThree() {
33        System.out.println("Executing task three in " + Thread.currentThread().getName());
34        try {
35            Thread.sleep(1000);
36        } catch (InterruptedException e) {
37            throw new IllegalStateException(e);
38        }
39        return CompletableFuture.completedFuture(null);
40    }
41}

6. 控制器

在控制器中,我们将调用这些异步服务方法,并等待它们完成。

 

java

深色版本

1import org.springframework.beans.factory.annotation.Autowired;
2import org.springframework.web.bind.annotation.GetMapping;
3import org.springframework.web.bind.annotation.RestController;
4import org.springframework.web.context.request.async.DeferredResult;
5
6@RestController
7public class AsyncController {
8
9    private final AsyncService asyncService;
10
11    @Autowired
12    public AsyncController(AsyncService asyncService) {
13        this.asyncService = asyncService;
14    }
15
16    @GetMapping("/execute-tasks")
17    public DeferredResult<Void> executeTasks() {
18        DeferredResult<Void> deferredResult = new DeferredResult<>();
19        CompletableFuture<Void> taskOneFuture = asyncService.performTaskOne();
20        CompletableFuture<Void> taskTwoFuture = asyncService.performTaskTwo();
21        CompletableFuture<Void> taskThreeFuture = asyncService.performTaskThree();
22
23        CompletableFuture.allOf(taskOneFuture, taskTwoFuture, taskThreeFuture)
24                .thenRun(() -> deferredResult.setResult(null));
25
26        return deferredResult;
27    }
28}

7. 测试

启动应用并访问 /execute-tasks 路径,检查控制台输出,确认任务是否并行执行。

 

bash

深色版本

1curl http://localhost:8080/execute-tasks

您应该看到类似下面的日志输出,显示任务正在不同的线程中并行执行:

 

深色版本

1Executing task one in AsyncExecutor-1
2Executing task two in AsyncExecutor-2
3Executing task three in AsyncExecutor-3

8. 结论

通过上述步骤,我们成功地在 Spring Boot 应用中实现了异步并行任务处理。这不仅可以提高系统的响应能力,还能显著改善用户体验。在实际应用中,可以根据具体的需求进一步调整线程池的参数,以达到最佳性能。

相关文章:

Spring Boot 实现异步处理多个并行任务

在现代Web应用开发中&#xff0c;异步处理和多任务并行处理对于提高系统的响应性和吞吐量至关重要。Spring Boot 提供了多种机制来实现异步任务处理&#xff0c;本文将介绍如何利用这些机制来优化您的应用程序性能。 1. 引言 在高负载情况下&#xff0c;如果所有的请求都采用…...

TiDB系列之:使用Flink TiDB CDC Connector采集数据

TiDB系列之&#xff1a;使用Flink TiDB CDC Connector采集数据 一、依赖项二、Maven依赖三、SQL Client JAR四、如何创建 TiDB CDC 表五、连接器选项六、可用元数据七、特征一次性处理启动阅读位置多线程读取DataStream Source 八、数据类型映射 TiDB CDC 连接器允许从 TiDB 数…...

每日一道算法题 最接近的三数之和

题目 16. 最接近的三数之和 - 力扣&#xff08;LeetCode&#xff09; Python class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()nlen(nums)ans0min_diffinf # infinite 无穷for i in range(n-2):tmpnums[i]li1rn-1while l<…...

搭建自己的金融数据源和量化分析平台(六):下载并存储沪深两市上市公司财报

基于不依赖wind、某花顺等第三方平台数据的考虑&#xff0c;尝试直接从财报中解析三大报表进而计算ROE等财务指标&#xff0c;因此需要下载沪深两市的上市公司财报数据&#xff0c;便于后续从pdf中解析三大报表。 深市爬虫好做&#xff0c;先放深市爬虫&#xff1a; 根据时间段…...

C语言-常见关键字详解

一、const 关键字const用于声明常量&#xff0c;赋值后&#xff0c;其值不能再被修改。 示例&#xff1a; const int MAX_COUNT 100; 二、static static关键字在不同情境下有不同作用&#xff1a; 1.函数中的静态变量&#xff1a;保留变量状态&#xff0c;仅初始化一次&a…...

异步编程之std::future(一): 使用

目录 1.概述 2.std::future的基本用法 3.使用 std::shared_future 4.std::future的使用场景 5.总结 1.概述 在编程实践中&#xff0c;我们常常需要使用异步调用。通过异步调用&#xff0c;我们可以将一些耗时、阻塞的任务交给其他线程来执行&#xff0c;从而保证当前线程的…...

Vue3 + JS项目配置ESLint Pretter

前言 如果在开发大型项目 同时为多人协作开发 那么 ESLint 在项目中极为重要 在使用 ESLint 的同时 也需要使用 Pretter插件 统一对代码进行格式化 二者相辅相成 缺一不可 1. 安装 VsCode 插件 在 VsCode 插件市场搜索安装 ESLint 和 Pretter 2. 安装依赖 这里直接在 pac…...

JavaScript (十四)——JavaScript typeof和类型转换

目录 JavaScript typeof, null, 和 undefined typeof 操作符 null undefined undefined 和 null 的区别 JavaScript 类型转换 JavaScript 数据类型 JavaScript 类型转换 将数字转换为字符串 将布尔值转换为字符串 将日期转换为字符串 将字符串转换为数字 一元运算符…...

CTF-web 基础

网络协议 OSI七层参考模型&#xff1a;一个标准的参考模型 物理层 网线&#xff0c;网线接口等。 数据链路层 可以处理物理层传入的信息。 网络层 比如IP地址 传输层 控制传输的内容的传输&#xff0c;在传输的过程中将要传输的信息分块传输完成之后再进行合并。 应用…...

CP AUTOSAR标准之ChineseV2XNetwork(AUTOSAR_SWS_ChineseV2XNetwork)(更新中……)

1 简介和功能概述 本文档指定了AUTOSAR基础软件模块中国车辆对接网络(CnV2xNet)的功能、API和配置。   中国车联网网络(CnV2xNet)与中国车联网消息(CnV2xMsg)、中国车联网管理(CnV2xMgt)、中国车联网安全(CnV2xSec)以及AUTOSAR BSW模块以太网接口(EthIf)共同构成了AUTOSAR架构…...

【hloc】 项目流程

hloc 项目流程 1. 数据集准备2. 特征提取3. 匹配特征4. 三维重建5. 定位6. 结果评估7. 示例脚本 这个项目涉及到了视觉定位和三维重建的一系列步骤&#xff0c;从特征提取、匹配、三维重建到定位和结果评估。通过提供的脚本文件&#xff0c;用户可以方便地运行整个流程。 1. 数…...

鸿蒙系统开发【应用接续】基本功能

应用接续 介绍 基于ArkTS扩展的声明式开发范式编程语言编写的一个分布式视频播放器&#xff0c;主要包括一个直播视频播放界面&#xff0c;实现视频播放时可以从一台设备迁移到另一台设备继续运行&#xff0c;来选择更合适的设备继续执行播放功能以及PAD视频播放时协同调用手…...

nextTick方法的作用是什么?什么时候会用到

nextTick 方法在 Vue.js 中扮演着重要的角色&#xff0c;它用于在下次 DOM 更新循环结束之后执行延迟回调。这主要用于确保在 Vue 完成 DOM 更新后执行依赖于 DOM 的操作。 作用 确保 DOM 更新完成&#xff1a;Vue 的 DOM 更新是异步的&#xff0c;当你修改了数据后&#xff0…...

多 NodeJS 环境管理

前言 对于某个项目依赖特定版本的 NodeJS&#xff0c;或几个项目的 NodeJS 版本冲突时&#xff0c;需要在系统中安装多个版本的 NodeJS&#xff0c;这时可以使用一些工具来进行多个 NodeJS 的管理。 有很多类似的 NodeJS 管理工具&#xff0c;如 nvm, nvs, n 等&#xff0c;接…...

解决网站被植入跳转木马病毒

概述 网站被植入跳转木马病毒是一种常见的安全威胁&#xff0c;它可能导致网站用户被重定向到恶意站点。本文将指导您如何检测、清除这类木马病毒以及采取预防措施。 步骤1&#xff1a;确认感染 首先&#xff0c;需要确认您的网站确实受到了跳转木马的影响。 示例&#xff…...

Node.js(6)——npm软件包管理

npm npm是Node.js标准的软件包管理器。 使用&#xff1a; 初始化清单文件&#xff1a;npm init-y(得到package.json文件&#xff0c;有则略过此命令)下载软件包&#xff1a;npm i 软件包名称使用软件包 示例&#xff1a; 初始状态下npm文件夹下只有server.js,下载软件包前看…...

区块链核心概念与技术架构简介

引言 区块链&#xff0c;一种分布式账本技术&#xff0c;不仅为数字货币提供了基础设施&#xff0c;更在金融、供应链、物联网等多个领域展现出广泛的应用前景。区块链技术被认为是继蒸汽机、电力、互联网之后&#xff0c;下一代颠覆性的核心技术。 如果说蒸汽机释放了人们的…...

≌图概念凸显包含射线V的直线W是比V长的线

黄小宁 x轴中&#xff1a;各非负数点xh≥0都变回自己即都作恒等变换&#xff0c;其余点x-h都变号为xh就使x轴失去负数点而变为射线V{xh≥0}。这x轴变为射线V⊂x轴是不保距变换即不是x轴的刚体运动使x轴不≌V⊂x轴&#xff08;小学生都知道x轴不≌射线V&#xff09;。据≌图概念…...

子路由的配置方法?

子路由的配置方法主要涉及到在Vue-router中定义嵌套路由&#xff0c;即一个路由内部包含多个子路由。以下是配置子路由的基本步骤&#xff1a; 1. 定义父路由 首先&#xff0c;在Vue Router中定义父路由。父路由可以像其他普通路由一样定义&#xff0c;但通常会有一个组件与之…...

【大模型从入门到精通2】openAI api的入门介绍2

互动对话界面的搭建 让我们来看看如何建立一个互动对话界面&#xff0c;用户可以在此输入查询&#xff0c;系统实时处理并显示响应。 import panel as pn # 用于构建图形用户界面# 初始化对话历史记录和GUI组件 conversation_history [] input_widget pn.widgets.TextInpu…...

【前端编程小白】的HTML从零入门到实战

之前有高中毕业生读了博客&#xff0c;想让我帮他找一些前端入门的内容&#xff0c;他们报的计算机专业&#xff0c;想利用开学前夕学习一下&#xff0c;我给他推荐了一些菜鸟教程呀什么的。后来想&#xff0c;看来还是很多人需要一些更加入门的可成的&#xff0c;而且很多教程…...

easyexcel读文件入批量入es

1. 封装实体类&#xff0c;并对应excel表中的列 Data public class User {private String md5;private String id; ExcelProperty(value "age")private String age;ExcelProperty(value "username")private String name;} 2. 批量入库 private void in…...

JS+H5打字练习器

实现功能 1.导入.TXT文件到打字练习内容&#xff08;部分浏览器可能出于安全问题限制了这一步操作&#xff09; 2.输入文本到打字练习内&#xff08;弹出输入框&#xff0c;将要练习的内容输入至输入框&#xff09; 3. 开始练习&#xff0c;并根据正误在打字练习内容文本上修…...

windows系统关闭开机自检硬盘

效果&#xff1a; 注册表关闭开机硬盘自检&#xff0c;你可以按照以下步骤操作&#xff1a; 打开注册表编辑器&#xff1a; 按 Win R 键打开“运行”对话框。输入 regedit 并按回车&#xff0c;打开注册表编辑器。 定位到自检相关的键&#xff1a; 依次展开以下路径&#x…...

【多线程开发 5】实践使用Lock和Condition

Lock和Condition Lock 线程之间同步或者竞争都需要锁这类结构&#xff0c;一般我们都会用Object的wait和signal搭配synchronized关键字进行多线程开发&#xff0c;但是很多时候会造成死锁的现象&#xff0c;这是因为synchroniezd无法破坏死锁的产生条件&#xff0c;但是Lock接…...

2.4-结构化并发:协程的结构化异常管理

文章目录 协程结构化异常流程协程结构化异常流程和取消流程的区别子协程异常为什么要连带取消父协程&#xff1f; CoroutineExceptionHandler异常协程异常的最后一道拦截&#xff1a;CoroutineExceptionHandlerCoroutineExceptionHandler 为什么只能设置给最外层协程才有效&…...

Android 12.0 debug版本打开OEM解锁开关功能实现

通常为了方便push在debug版本会采用如下命令 adb root adb disable-verity 提示&#xff1a; Device is locked. Please unlock the device first. 查找日志可以发现system/core/set-verity-state/set-verity-state.cpp文件中is_avb_device_locked方法里 这个获取ro.boot…...

linux用户组练习

准备工作 [rootlocalhost ~]# watch -n 1 tail -n 5 /etc/group使用watch 动态监控 1.建立用户组 shengcan&#xff0c;其id 为2000 2.建立用户组 caiwu&#xff0c;其id 为 2001 3.足建立用户组 jishu&#xff0c;其id 为 2002 4.建立用户lee&#xff0c;指定其主组id为sh…...

[Docker][Docker Container]详细讲解

目录 1.什么是容器&#xff1f;2.容器命令1.docker creatre2.docker run3.docker ps4.docker logs5.docker attach6.docker exec7.docker start8.docker stop9.docker restart10.docker kill11.docker top12.docker stats13.docker container inspect14.docker port15.docker c…...

塑造美好心灵,激发创造活力|第三届瓷艺中华“陶溪川杯”儿童青少年陶瓷作品展开展

第三届瓷艺中华“陶溪川杯”儿童青少年陶瓷作品展 展览现场 由中央美术学院、景德镇陶瓷大学、景德镇陶文旅控股集团共同主办&#xff0c;由中国非物质文化遗产保护协会陶瓷分会、中国文化艺术发展促进会陶瓷专业委员会、中央美术学院陶瓷艺术研究院、中央美术学院少儿美术教…...

程序员做游戏还是做网站好/如何做网站推广广告

如果面试官问你&#xff0c;类加载过程是哪几步&#xff1f; 巴拉巴拉巴拉…&#xff08;加载、验证、准备、解析、初始化&#xff09; 见这小伙子面容惊奇&#xff0c;脸泛红光&#xff0c;不由自主地就问了一下双亲委派模型说一下吧&#xff1b;遇见没准备充分的&#xff0c;…...

网站定制化价格/网络平台推广有哪些渠道

今天我将要为大家讲解一个不同于我们日常用的Windows系统&#xff0c;它就是Linux。Linux是一套免费使用和自由传播的类UNIX操作系统&#xff0c;它不受任何商品化版权的制约&#xff0c;全世界都能自由使用。它不像Windows那样通过傻瓜式操作用户很容易上手。Linux要想实现强大…...

东莞网站建设推广公司/优秀软文案例

mac下所有vim的配色方案的样式。 下面讲解如何设置这些好看的配色 首先&#xff1a;在终端输入 vim ~/.bash_profile 查看是否有上面提到的某些配色&#xff0c;所有配色均是以.vim结束的&#xff0c;果有的话&#xff0c;再输入&#xff1a; $ cd ~/ 到用户主目录&#xff0c;…...

开发商交房必备条件/seo交流论坛

之前下载vc运行库都是百度&#xff0c;从中关村、当下等软件网站下载&#xff0c;但是最近这些网站涉及到安全问题&#xff0c;所以从官网下载比较合适 微软官网-中文 在搜索中 搜索vc2010/2015等&#xff0c;搜索结果中找到xxxxxxxxxx Redistributable Package (x64)这种Redis…...

东圃网站建设/国家新闻最新消息今天

应用示例&#xff1a;这里我们假设Master-Slave已经建立。#启动master服务器。[rootStephen-PC redis]# redis-cli -p 6379redis 127.0.0.1:6379>#情况Master当前数据库中的所有Keys。redis 127.0.0.1:6379> flushdbOK#在Master中创建新的Keys作为测试数据。redis 127.0.…...

wordpress 4.0 静态化/微信营销管理软件

使用邮箱测试时&#xff0c;必须得开启邮箱的pop3/smtp服务&#xff0c;并找到邮箱正确的SMTP服务器地址以及端口。这里以QQ邮箱为例 打开QQ邮箱后&#xff0c;选择“设置-账户”这里写图片描述 拉动滚动条到下方这里写图片描述 开启pop3/smtp服务&#xff0c;并保存该授权码作…...