SpringBoot多个@Scheduled注解的方法,会阻塞吗

简介: 【6月更文挑战第9天】SpringBoot多个@Scheduled注解的方法,会阻塞吗

在Spring Boot中,如果使用@Scheduled注解来定义多个定时任务,默认情况下这些任务将会被安排在一个单线程的调度器中执行。这意味着,这些任务将会串行执行,而不是并行执行。当一个任务正在执行时,其他被触发的任务将会等待当前任务完成后再开始执行,这可能导致任务执行上的阻塞,特别是当某个任务执行时间较长时,可能会延迟后续任务的启动时间,影响定时任务的准时性。

解决阻塞问题的方法包括:

  1. 使用自定义线程池:你可以通过配置一个自定义的TaskScheduler或者ThreadPoolTaskScheduler来为@Scheduled任务提供一个线程池,从而允许多个任务并行执行。例如,可以在配置类中定义一个ThreadPoolTaskScheduler Bean:

    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
         
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10); // 设置线程池大小
        scheduler.setThreadNamePrefix("my-scheduled-task-");
        return scheduler;
    }
    

    并确保你的配置类被扫描到,且在@EnableScheduling注解的上下文中。

  2. 使用异步处理:结合@Async注解和@EnableAsync可以使得每个@Scheduled任务在独立的线程中异步执行。首先需要在配置类中启用异步支持,并配置一个线程池,然后在每个定时任务方法上添加@Async`注解。

    @Configuration
    @EnableAsync
    public class AsyncConfig {
         
        @Bean
        public Executor taskExecutor() {
         
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(10);
            executor.setMaxPoolSize(20);
            executor.setQueueCapacity(200);
            executor.setThreadNamePrefix("Async-");
            executor.initialize();
            return executor;
        }
    }
    
    @Component
    public class MyTasks {
         
        @Async
        @Scheduled(cron = "...")
        public void taskOne() {
         
            // 任务逻辑
        }
    
        @Async
        @Scheduled(cron = "...")
        public void taskTwo() {
         
            // 任务逻辑
        }
    }
    

采用上述任一方法,都可以有效避免因任务执行阻塞导致的定时任务调度延迟问题,提升系统的并发处理能力。

目录
相关文章
|
11天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
30 0
|
18天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
42 4
SpringBoot必须掌握的常用注解!
|
20天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
64 2
|
20天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
34 1
|
14天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
12 0
|
27天前
|
存储 Java 数据管理
强大!用 @Audited 注解增强 Spring Boot 应用,打造健壮的数据审计功能
本文深入介绍了如何在Spring Boot应用中使用`@Audited`注解和`spring-data-envers`实现数据审计功能,涵盖从添加依赖、配置实体类到查询审计数据的具体步骤,助力开发人员构建更加透明、合规的应用系统。
|
6月前
|
XML Java 调度
SpringBoot中定时任务入门(@Scheduled )详解
SpringBoot中定时任务入门(@Scheduled )详解
922 0
|
Java Maven Spring
SpringBoot整合定时任务----Scheduled注解实现(一个注解全解决)
一、使用场景 定时任务在开发中还是比较常见的,比如:定时发送邮件,定时发送信息,定时更新资源,定时更新数据等等…
113 2
SpringBoot整合定时任务----Scheduled注解实现(一个注解全解决)
|
缓存 NoSQL Java
SpringBoot定时任务@Scheduled的多线程使用
@Scheduled是Spring框架中的一个注解,它可以用于配置定时任务,使得方法可以按照规定的时间间隔定时执行。在使用该注解时,我们可以指定任务的执行时间、循环周期、并发数等参数,从而实现定时任务的功能。在Spring Boot中,@Scheduled注解可以直接应用于方法上。
445 0
|
Java 数据库 Spring
SpringBoot ~ 定时任务@Scheduled
定时任务@Scheduled 定时任务是企业级开发常见的任务,例如定时统计订单数,数据库备份,定时发送短信和邮件,定时统计博客访客等。简单定时任务通过Spring中的@Schedule注解实现,复杂定时任务可以通过集成Quartz来实现。
1148 0