应用中心
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
博客
Blog
ToB门户
了解全球最新的ToB事件
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
数据库
›
SQL-Server
›
Spring Boot异步任务、任务调度与异步请求线程池的使用 ...
Spring Boot异步任务、任务调度与异步请求线程池的使用及原理 ...
海哥
论坛元老
|
2024-10-21 01:46:16
|
显示全部楼层
|
阅读模式
楼主
主题
1587
|
帖子
1587
|
积分
4761
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
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 {
@Async
public void t1() throws InterruptedException {
// 模拟耗时任务
Thread.sleep(5000);
}
@Async
public 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;
}
@Override
public 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 {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Executing Sample Job at " + System.currentTimeMillis());
}
}
@Configuration
public class QuartzConfig {
@Bean
public JobDetail sampleJobDetail() {
return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob").storeDurably().build();
}
@Bean
public 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 {
@Autowired
private 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中异步任务、任务调度和异步请求线程池的使用及原理。通过公道使用这些技术,可以显著提高体系的性能和响应速度,提拔用户体验。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
海哥
论坛元老
这个人很懒什么都没写!
楼主热帖
makefile简单脚本编写和Linux调试器gdb ...
【第90题】JAVA高级技术-网络编程9(简 ...
CMOS图像传感器——黑电平校正 ...
windows提权-系统错误配置提权 ...
什么是精准卫星授时?什么是NTP网络时 ...
TCP 时间戳妙用
C++ 深度解析教程(十七)C 语言异常处 ...
Linux【实操篇】—— 日志管理 ...
如何使用 FlowUs 、Notion 等笔记软件 ...
姚凯大学生创业导论课后答案2022 ...
标签云
集成商
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表