spring boot中的定时任务

  1. SpringBoot中的定时任务主要通过@Scheduled注解以及SchedulingConfigurer接口实现。

  2. @Scheduled注解是Spring提供的一个注解,用于标记方法作为定时任务执行:配置方法在指定的时间间隔或时间点执行,实现各种定时任务需求。

    //在你需要定时的方法上加上@Scheduled注解,并用corn表达式指定如何定时,下式表达了每隔15秒执行一次方法
    @Scheduled(cron = "*/15 * * * * ?")
    public void hello() {
        System.out.println("hello执行了");
    }
    
  3. 但是要记得在启动类上开启定时功能:@EnableScheduling // 开启定时任务功能

  4. @Scheduled任务在单线程环境下执行,可能出现任务堆积的情况,尤其在任务量大或任务执行时间长的情况下,而且这些任务可能会变得混乱和难以管理。定时任务的配置分散在各个任务方法中,不利于统一管理和维护。对于需要根据动态条件创建或销毁定时任务的情况,@Scheduled注解也无法满足需求。

  5. 使用SchedulingConfigurer接口来动态地创建和管理定时任务。通过实现 SchedulingConfigurer 接口,我们可以编写代码来动态地注册和管理定时任务,从而实现灵活的任务调度需求。SchedulingConfigurer 接口是 Spring 提供的一个用于定时任务配置的扩展接口,它允许开发人员更细粒度地控制定时任务的执行。通过实现SchedulingConfigurer接口,可以自定义任务调度器(TaskScheduler),配置线程池等参数,以满足不同场景下的定时任务需求。

    @Configuration  
    @EnableScheduling  
    public class CustomSchedulingConfig implements SchedulingConfigurer {
    
    	@Override  
    	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    		// 定时任务逻辑
    	}
    }
    
  6. 通过实现SchedulingConfigurer接口,重写configureTasks方法,自定义任务调度器的配置。此外我们还可以配置线程池,用于控制定时任务执行时的线程数量、并发性等参数。

    @Bean(destroyMethod = "shutdown")  
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {  
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();  
        scheduler.setPoolSize(5); // 设置线程池大小  
        scheduler.setThreadNamePrefix("scheduled-task-"); // 设置线程名称前缀  
        scheduler.setAwaitTerminationSeconds(60); // 设置终止等待时间  
    	// 设置处理拒绝执行的任务异常
    	scheduler.setRejectedExecutionHandler((r, executor) -> log.error("Task rejected", r));
    	// 处理定时任务执行过程中抛出的未捕获异常
    	scheduler.setErrorHandler(e -> log.error("Error in scheduled task", e));
        return scheduler;  
    }
    //然后将自定义的ThreadPoolTaskScheduler设置到ScheduledTaskRegistrar中去:
    @Override  
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    	// 定时任务逻辑
    	taskRegistrar.setTaskScheduler(threadPoolTaskScheduler());
    }
    //通过SchedulingConfigurer接口,可以更灵活地配置任务调度器和定时任务的执行规则,比如动态注册定时任务、动态修改任务执行规则等。
    
posted @ 2024-05-21 09:17  Hanyta  阅读(180)  评论(0编辑  收藏  举报