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

Spring Boot异步任务、任务调度与异步请求线程池的使用及原理

Spring Boot异步任务、任务调度与异步请求线程池的使用及原理

在Spring Boot应用程序中,异步任务、任务调度和异步请求线程池是提高系统性能和响应速度的重要工具。本文将详细讲解这些概念的使用及原理。

一、异步任务

异步任务是指可以在后台线程上执行的任务,不会阻塞主线程。这在处理耗时操作时尤为重要,如发送电子邮件、处理大文件或进行数据库批量操作。

1. 使用@Async注解

要在Spring Boot中使用异步任务,首先需要启用异步支持。这可以通过在配置类上使用@EnableAsync注解来实现。然后,在需要异步执行的方法上使用@Async注解。

@SpringBootApplication
@EnableAsync
public class AsyncExampleApplication {public static void main(String[] args) {SpringApplication.run(AsyncExampleApplication.class, args);}
}@Service
public class AsyncService {@Asyncpublic void t1() throws InterruptedException {// 模拟耗时任务Thread.sleep(5000);}@Asyncpublic Future<String> t2() throws InterruptedException {// 模拟耗时任务Thread.sleep(5000);return new AsyncResult<>("async tasks done!");}
}
2. 注意事项
  • @Async注解的方法必须是public的,以便可以被代理。
  • 不能在同一个类中调用@Async方法,因为这样会绕过方法代理。
  • @Async注解的方法不能是static的。
  • @Async注解不能与Bean对象的生命周期回调函数(如@PostConstruct)一起使用。
  • 异步类必须注入到Spring IOC容器中。
3. 自定义线程池

默认情况下,Spring会使用SimpleAsyncTaskExecutor来执行异步任务。然而,SimpleAsyncTaskExecutor不是真正的线程池,每次调用都会创建一个新的线程,这在高并发情况下会导致性能问题。因此,通常建议自定义线程池。

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(20);executor.setQueueCapacity(200);executor.setThreadNamePrefix("Async-");executor.initialize();return executor;}@Overridepublic Executor getAsyncExecutor() {return taskExecutor();}
}
二、任务调度

任务调度是指按照预定的时间或条件执行任务。Spring Boot支持多种任务调度方式,包括使用Quartz和Elastic-Job等开源框架。

1. 使用Quartz

Quartz是一个功能强大的任务调度框架,支持分布式调度。要在Spring Boot中使用Quartz,首先需要引入相关依赖,并进行配置。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId>
</dependency>

然后,在application.properties中进行配置,并定义任务和任务调度。

@Component
public class SampleJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("Executing Sample Job at " + System.currentTimeMillis());}
}@Configuration
public class QuartzConfig {@Beanpublic JobDetail sampleJobDetail() {return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob").storeDurably().build();}@Beanpublic Trigger sampleJobTrigger() {SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever();return TriggerBuilder.newTrigger().forJob(sampleJobDetail()).withIdentity("sampleTrigger").withSchedule(scheduleBuilder).build();}
}
2. 使用Elastic-Job

Elastic-Job是当当网开源的一个分布式调度解决方案,具有灵活的分片策略和强大的任务管理能力。使用Elastic-Job时,同样需要引入相关依赖并进行配置。

三、异步请求线程池

异步请求线程池用于处理异步HTTP请求,提高系统的并发处理能力。在Spring Boot中,可以使用ThreadPoolTaskExecutor来实现异步请求线程池。

@Configuration
public class AsyncConfig {@Bean(name = "asyncExecutor")public Executor asyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(20);executor.setQueueCapacity(200);executor.setThreadNamePrefix("AsyncHttp-");executor.initialize();return executor;}
}

然后,在控制器中使用@Async注解和自定义的线程池来处理异步请求。

@RestController
public class AsyncController {@Autowiredprivate AsyncService asyncService;@GetMapping("/asyncTask")public String asyncTask() {asyncService.asyncMethod();return "Async task started";}
}@Service
public class AsyncService {@Async("asyncExecutor")public void asyncMethod() {// 模拟耗时任务try {Thread.sleep(5000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println("Async method completed");}
}

总结

本文详细讲解了Spring Boot中异步任务、任务调度和异步请求线程池的使用及原理。通过合理使用这些技术,可以显著提高系统的性能和响应速度,提升用户体验。

相关文章:

Spring Boot异步任务、任务调度与异步请求线程池的使用及原理

Spring Boot异步任务、任务调度与异步请求线程池的使用及原理 在Spring Boot应用程序中&#xff0c;异步任务、任务调度和异步请求线程池是提高系统性能和响应速度的重要工具。本文将详细讲解这些概念的使用及原理。 一、异步任务 异步任务是指可以在后台线程上执行的任务&a…...

Java爬虫之使用Selenium WebDriver 爬取数据

这里写自定义目录标题 Selenium WebDriver简介一、安装部署二、Java项目中使用1.引入依赖2.示例代码 三、WebDriver使用说明1.WebDriver定位器2.常用操作3.使用 cookie4.键盘与鼠标操作 Selenium WebDriver简介 Selenium WebDriver 是一种用于自动化测试 Web 应用程序的工具。…...

MyBatis 中updateByPrimaryKey和updateByPrimaryKeySelective区别

在 MyBatis 中&#xff0c;updateByPrimaryKey和updateByPrimaryKeySelective主要有以下区别&#xff1a; 一、功能 updateByPrimaryKey&#xff1a; 会根据传入的实体对象&#xff0c;将数据库表中对应主键的记录所有字段全部更新为实体对象中的值。即使实体对象中的某些字段…...

JavaScript下载文件(简单模式、跨域问题、文件压缩)

文章目录 简介简单文件下载通过模拟form表单提交通过XMLHttpRequest方式 跨域(oss)下载并压缩文件完整示例文件压缩跨域设置 简介 相信各位开发朋友都遇到过下载的文件的需求&#xff0c;有的非常简单&#xff0c;基本链接的形式就可以。 有的就比较复杂&#xff0c;涉及跨域…...

Django 定义使用模型,并添加数据

教材&#xff1a; Python web企业级项目开发教程&#xff08;黑马程序员&#xff09;第三章 模型 实验步骤&#xff1a; 1.创建项目和应用 前置步骤可看前文&#xff0c;进入到指定文件位置后创建 django-admin startproject mysite python manage.py startapp app01 2.注册…...

联名物料常泄漏?一端叠满“安全buff”

前段时间&#xff0c;一则关于爆火影视剧与知名茶饮品牌联名的消息在社交平台上迅速传播&#xff0c;宣传物料的照片也随之曝光——门店尚未上新&#xff0c;“小道消息”便已被疯传。但这种情况并非首次发生&#xff0c;让众多网友不禁猜想&#xff1a;这究竟是一场精心策划的…...

Flutter UI组件库(JUI)

Flutter UI组件库 (JUI) 介绍 您是否正在寻找一种方法来简化Flutter开发过程&#xff0c;并创建美观、一致的用户界面&#xff1f;您的搜索到此为止&#xff01;我们的Flutter UI组件库&#xff08;JUI&#xff09;提供了广泛的预构建、可自定义组件&#xff0c;帮助您快速构建…...

国外电商系统开发-运维系统远程文件

设计初衷是为了让所有人都能方便的打开网页&#xff0c;就能查看Linux系统文件内容&#xff0c;而不再用cat、vim、more等命令去打开文件&#xff0c;这对于我们一个普通的研发或者是财务人员来说&#xff0c;显得太繁琐&#xff0c;因为他们很可能不会这些命令&#xff0c;其次…...

4. Node.js Path模块

2.3Path模块 2.3.1获取js文件的绝对路径 console.log(__dirname) //js文件所在的文件夹的绝对路径 console.log(__filename) //js文件的绝对路径输出&#xff1a; G:\py_project\nodejs_study G:\py_project\nodejs_study\file.js2.3.2拼接规范的绝对路径path.r…...

重构长方法之分解条件表达式

分解条件表达式 是一种重构长方法中常用的技术&#xff0c;它适用于复杂的条件逻辑。在方法中&#xff0c;条件分支&#xff08;if-else 或 switch&#xff09;有时会变得条件非常多&#xff0c;非常复杂&#xff0c;难以理解和维护。通过分解条件逻辑&#xff0c;可以让代码更…...

蚁群算法养老服务人员智能调度系统

养老行业近年来越发热门&#xff0c;如何有效调配服务人员成为许多机构的痛点。我们结合智能算法技术&#xff0c;开发出了一款专为养老行业量身打造的“蚁群算法养老服务人员调度系统”&#xff0c;能够精准、高效地为机构分配人员&#xff0c;从此告别人力资源调度难题。 系…...

java使用 IDEA自动补全功能 AI 插件

国内插件&#xff1a; CodeGeeX&#xff1a; 功能特性&#xff1a; 由国内团队开发&#xff0c;是一款智能编程助手插件。它集成了多种人工智能技术&#xff0c;能够在多个编程语言中提供智能代码补全、代码生成、代码优化和注释生成等功能。该插件特别适用于常见的编程任务…...

【ShuQiHere】 AI与自我意识:能否创造真正的自觉机器人?

&#x1f916;【ShuQiHere】 &#x1f4dc; 目录 引言人类意识的探索机器意识的五大理论 功能主义&#xff08;Functionalism&#xff09;信息整合&#xff08;Information Integration&#xff09;体现主义&#xff08;Embodiment&#xff09;行动主义&#xff08;Enaction&…...

【Linux 从基础到进阶】CPU性能调优与监控

CPU性能调优与监控 1. 引言 在计算机系统中&#xff0c;CPU是核心组件之一&#xff0c;其性能直接影响系统的整体表现和响应速度。无论是在企业服务器环境、虚拟化环境&#xff0c;还是大数据计算场景&#xff0c;优化和监控CPU性能都至关重要。通过合理的调优策略和监控工具…...

Centos基线自动化检查脚本

此脚本是一个用于检查Linux系统安全配置的Bash脚本。它通过多项安全标准对系统进行评估&#xff0c;主要检查以下内容&#xff1a; IP地址获取&#xff1a;脚本首先获取主机的IP地址&#xff0c;确保其以10.115开头。 密码策略检查&#xff1a; 检查最小密码长度&#xff08;P…...

OpenCV答题卡识别

文章目录 一、基本流程二、代码实现1.定义函数2.图像预处理&#xff08;1&#xff09;高斯模糊、边缘检测&#xff08;2&#xff09;轮廓检测&#xff08;3&#xff09;透视变换&#xff08;4&#xff09;阈值处理和轮廓检测 3.筛选和排序选项轮廓4.判断答案5.显示结果 三、总结…...

通用数据库对象设计

1. 公共属性 这里的数据模型以陈品山的实体-关系模型为基础&#xff0c;增加了两点修改。一是用“组”的概念表达实体间关系&#xff0c;并将组作为一种特殊实体。二是采用继承的思想&#xff0c;将实体的公共属性提取出来&#xff0c;放到统一表中。实体的特有属性保存在单独…...

Java基础12-特殊文件和日志技术

十二、特殊文件和日志技术 1、特殊文件 properties&#xff1a;用来存储键值对数据。 xml&#xff1a;用来存储有关系的数据。 1.1 properties文件 特点&#xff1a;存储键值对&#xff0c;键不能重复&#xff0c;文件后缀一般是.properties结尾的。 properties&#xff1a;是…...

2.4 STM32启动过程

目录 一,启动Flow 1.1 初始化MSP 1.2 初始化PC 1.3 设置堆栈大小 1.4初始化中断向量表 1.5 调用初始化函数(可选) 1.6 调用__main 二,Reset_Handler函数 一,启动Flow 下面是stm32在内部FLASH启动的启动建议流程图,在stm32复位到执行我们程序的main函数的过程中,…...

rm: cannot remove: Device or resource busy 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

量子计算中Loschmidt回声相位测量的创新方法

1. 量子计算中的Loschmidt回声相位测量方法概述Loschmidt回声是量子动力学中一个重要的概念&#xff0c;它描述了量子系统在时间反演演化后与初始状态的相似程度。在量子计算领域&#xff0c;精确测量Loschmidt回声的相位信息对于理解量子系统的非平衡态行为、计算能量本征值以…...

除了排错,你可能不知道OPC Expert v8.1还能做这些:数据归档、计算与冗余实战

解锁OPC Expert v8.1的隐藏潜力&#xff1a;数据归档、实时计算与冗余架构实战指南在工业自动化领域&#xff0c;OPC Expert常被视为故障排查的"急救箱"&#xff0c;但它的能力远不止于此。当大多数工程师还在用它解决DCOM配置问题时&#xff0c;少数先行者已经用它重…...

警惕!AI正在悄悄重构全球攻防格局

警惕&#xff01;AI 正在悄悄重构全球攻防格局 热点聚焦 AI重构网络安全&#xff1a;全球巨头加速布局 2026年5月&#xff0c;全球网络安全领域迎来重大变革&#xff0c;AI技术正在重塑攻防格局。OpenAI发布专为网络安全防御打造的集成化AI平台Daybreak&#xff0c;将安全防…...

嵌入式快速原型开发:基于Sceptre平台与LPC2148的实战指南

1. 项目概述&#xff1a;Sceptre&#xff0c;一个被低估的嵌入式快速原型利器 在嵌入式开发的世界里&#xff0c;我们总是在寻找那个“刚刚好”的平台&#xff1a;它要足够强大&#xff0c;能跑复杂的算法&#xff1b;要足够小巧&#xff0c;能塞进各种外壳&#xff1b;要足够便…...

Windows终极PDF处理工具:3步免费安装Poppler完整指南

Windows终极PDF处理工具&#xff1a;3步免费安装Poppler完整指南 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 你是否曾经为在Windows上处理PDF文…...

SMUDebugTool终极指南:如何深度掌控AMD Ryzen处理器的隐藏性能

SMUDebugTool终极指南&#xff1a;如何深度掌控AMD Ryzen处理器的隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...

Windows文件夹共享

目标&#xff1a;同一局域网实现在一台计算机上共享文件夹&#xff0c;在另一台电脑访问一、电脑A 1.点击要共享的文件夹 -> 属性 -> 共享2.添加Everyone用户组3.控制面板中网络共享关闭密码保存&#xff0c;在访问时不用输入账号密码。二、电脑B 1.在文件资源管理器路径…...

Unity动态自然系统:Forest Environment-Dynamic Nature深度解析

1. 这不是“贴图堆砌”&#xff0c;而是自然系统级建模&#xff1a;Forest Environment-Dynamic Nature 的真实定位你有没有试过在Unity里拖进几棵树、铺点草、加个天空盒&#xff0c;然后发现场景像一张静止的风景明信片——风不动、叶不摇、雨不落、雾不散&#xff1f;我做过…...

探索Windows 10上的Android世界:揭秘WSA-Windows-10项目的3个技术突破

探索Windows 10上的Android世界&#xff1a;揭秘WSA-Windows-10项目的3个技术突破 【免费下载链接】WSA-Windows-10 This is a backport of Windows Subsystem for Android to Windows 10. 项目地址: https://gitcode.com/gh_mirrors/ws/WSA-Windows-10 想象一下&#…...

基于PIC32的嵌入式MIDI合成器:从波表合成到硬件实现

1. 项目概述&#xff1a;一个基于嵌入式微控制器的MIDI声音合成器如果你对电子音乐制作、嵌入式开发&#xff0c;或者DIY硬件合成器感兴趣&#xff0c;那么“REMI Synth”这个项目绝对值得你花时间深入了解。它本质上是一个数字单音MIDI控制的声音合成器&#xff0c;核心是一块…...