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

海哥  论坛元老 | 2024-10-21 01:46:16 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1587|帖子 1587|积分 4761

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

异步任务是指可以在后台线程上实行的任务,不会壅闭主线程。这在处理耗时操作时尤为紧张,如发送电子邮件、处理大文件或进行数据库批量操作。
1. 使用@Async注解

要在Spring Boot中使用异步任务,首先必要启用异步支持。这可以通过在配置类上使用@EnableAsync注解来实现。然后,在必要异步实行的方法上使用@Async注解。
  1. @SpringBootApplication
  2. @EnableAsync
  3. public class AsyncExampleApplication {
  4.     public static void main(String[] args) {
  5.         SpringApplication.run(AsyncExampleApplication.class, args);
  6.     }
  7. }
  8. @Service
  9. public class AsyncService {
  10.     @Async
  11.     public void t1() throws InterruptedException {
  12.         // 模拟耗时任务
  13.         Thread.sleep(5000);
  14.     }
  15.     @Async
  16.     public Future<String> t2() throws InterruptedException {
  17.         // 模拟耗时任务
  18.         Thread.sleep(5000);
  19.         return new AsyncResult<>("async tasks done!");
  20.     }
  21. }
复制代码
2. 留意事项



  • 被@Async注解的方法必须是public的,以便可以被代理。
  • 不能在同一个类中调用@Async方法,因为这样会绕过方法代理。
  • 被@Async注解的方法不能是static的。
  • @Async注解不能与Bean对象的生命周期回调函数(如@PostConstruct)一起使用。
  • 异步类必须注入到Spring IOC容器中。
3. 自界说线程池

默认环境下,Spring会使用SimpleAsyncTaskExecutor来实行异步任务。然而,SimpleAsyncTaskExecutor不是真正的线程池,每次调用都会创建一个新的线程,这在高并发环境下会导致性能问题。因此,通常发起自界说线程池。
  1. @Configuration
  2. @EnableAsync
  3. public class AsyncConfig implements AsyncConfigurer {
  4.     @Bean(name = "taskExecutor")
  5.     public Executor taskExecutor() {
  6.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  7.         executor.setCorePoolSize(5);
  8.         executor.setMaxPoolSize(20);
  9.         executor.setQueueCapacity(200);
  10.         executor.setThreadNamePrefix("Async-");
  11.         executor.initialize();
  12.         return executor;
  13.     }
  14.     @Override
  15.     public Executor getAsyncExecutor() {
  16.         return taskExecutor();
  17.     }
  18. }
复制代码
二、任务调度

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

Quartz是一个功能强大的任务调度框架,支持分布式调度。要在Spring Boot中使用Quartz,首先必要引入相干依靠,并进行配置。
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-quartz</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>org.quartz-scheduler</groupId>
  7.     <artifactId>quartz</artifactId>
  8. </dependency>
复制代码
然后,在application.properties中进行配置,并界说任务和任务调度。
  1. @Component
  2. public class SampleJob implements Job {
  3.     @Override
  4.     public void execute(JobExecutionContext context) throws JobExecutionException {
  5.         System.out.println("Executing Sample Job at " + System.currentTimeMillis());
  6.     }
  7. }
  8. @Configuration
  9. public class QuartzConfig {
  10.     @Bean
  11.     public JobDetail sampleJobDetail() {
  12.         return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob").storeDurably().build();
  13.     }
  14.     @Bean
  15.     public Trigger sampleJobTrigger() {
  16.         SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever();
  17.         return TriggerBuilder.newTrigger().forJob(sampleJobDetail()).withIdentity("sampleTrigger").withSchedule(scheduleBuilder).build();
  18.     }
  19. }
复制代码
2. 使用Elastic-Job

Elastic-Job是当当网开源的一个分布式调度办理方案,具有机动的分片计谋和强大的任务管理本领。使用Elastic-Job时,同样必要引入相干依靠并进行配置。
三、异步请求线程池

异步请求线程池用于处理异步HTTP请求,提高体系的并发处理本领。在Spring Boot中,可以使用ThreadPoolTaskExecutor来实现异步请求线程池。
  1. @Configuration
  2. public class AsyncConfig {
  3.     @Bean(name = "asyncExecutor")
  4.     public Executor asyncExecutor() {
  5.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  6.         executor.setCorePoolSize(5);
  7.         executor.setMaxPoolSize(20);
  8.         executor.setQueueCapacity(200);
  9.         executor.setThreadNamePrefix("AsyncHttp-");
  10.         executor.initialize();
  11.         return executor;
  12.     }
  13. }
复制代码
然后,在控制器中使用@Async注解和自界说的线程池来处理异步请求。
  1. @RestController
  2. public class AsyncController {
  3.     @Autowired
  4.     private AsyncService asyncService;
  5.     @GetMapping("/asyncTask")
  6.     public String asyncTask() {
  7.         asyncService.asyncMethod();
  8.         return "Async task started";
  9.     }
  10. }
  11. @Service
  12. public class AsyncService {
  13.     @Async("asyncExecutor")
  14.     public void asyncMethod() {
  15.         // 模拟耗时任务
  16.         try {
  17.             Thread.sleep(5000);
  18.         } catch (InterruptedException e) {
  19.             Thread.currentThread().interrupt();
  20.         }
  21.         System.out.println("Async method completed");
  22.     }
  23. }
复制代码
总结

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表