基于spring的定时任务的实现

一、直接通过@Scheduled来实现

@Configuration
@EnableScheduling
public class TaskTimingJob {

    @Scheduled(fixedDelay=60000)
    private void configureTasks() {
        // todo
    }
}

@Scheduled主要的四个参数说明如下:

1、fixedRate是指上一次任务的开始时间到下一次任务的开始时间的间隔,如果阻塞会记录需要执行的次数,通畅后全部会执行。
2、fixedDelay是指了上一次任务的结束时间到下一次任务的开始时间的间隔,如果阻塞会记录需要执行的次数,通畅后全部会执行。
3、cron表达式和fixedRate有点相似,指在哪一刻执行任务,会在配置的任务开始时间判断任务是否可以执行,如果能则执行,不能则会跳过本次执行。
4、如果是强调任务间隔的定时任务,建议使用fixedRate和fixedDelay,如果是强调任务在某时某分某刻执行的定时任务,建议使用cron表达式。

注意:这种方式实现的定时任务当同一时刻有多个任务需要执行,会发生阻塞,即是单线程串行的执行方式,要避免这种情况就要加上注解@Async并且在springboot主类上加@EnableAsync开启异步,这样会默认使用自带的线程池,当然也可以使用自定义的,如下:

先配置好线程池

 @Configuration
   pbulic class PoolConfig {

        @Bean("taskPool")
        public Executor taskPoolExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(10);
            executor.setMaxPoolSize(20);
            executor.setQueueCapacity(200);
            executor.setKeepAliveSeconds(60);
            executor.setThreadNamePrefix("taskPoolExecutor-");
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            return executor;
        }
    }

然后在定时任务中加上@Async(“taskPool”)

@Configuration
@EnableScheduling
public class TaskTimingJob {

    @Scheduled(fixedDelay=60000)
    @Async(“taskPool”)
    private void configureTasks() {
        // todo
    }
}

二、通过实现SchedulingConfigurer接口

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // 自己定义线程池
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
    }
}

然后再写定时任务

@Component
public class TaskTimingJob {

    @Scheduled(fixedDelay=60000)
    private void configureTasks() {
        // todo
    }
}

结语:还有更加灵活的定时任务框架quartz,分布式定时任务框架xxl-job等,具体的技术选型根据自身业务即可。


版权声明:本文为zpfzly原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。