一、直接通过@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版权协议,转载请附上原文出处链接和本声明。