前言
之前遇到需要定时任务的需求时,我一般是选择通过java的Timer或是第三方的Quartz来进行实现
但是使用起来也是比较麻烦的,直到最近发现还可以去使用Springboot中的@Scheduled来解决问题,就十分方便了(当然spring中也可以使用,但如果不是springboot需要写一些xml文件的配置,也没有那么方便了)
下面具体说一下实现步骤
具体实现
1.启动类
首先需要在启动类上添加注解@EnableScheduling来开启定时任务
@SpringBootApplication
@EnableTransactionManagement
@EnableScheduling
public class SmartSchoolApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(SmartSchoolApplication.class, args);
}
}
2.类中方法
然后就是需要在类中需要定时任务的方法上添加注解@Scheduled
注意:类上要有@Component/@Controller等会将类标识spring可以识别的注解
@Component
public class TestSchedule {
@Scheduled(fixedDelay = 1000 ) //每一秒运行一次
public void printDate(){
System.out.println(new Date().toLocaleString());
}
}
在上述例子中是通过@Scheduled注解中的fixedDelay参数来实现的,但其实@Scheduled注解中有很多参数可以来定义定时参数
-
fixedDelay:指定两次任务执行的时间间隔(毫秒),此时间间隔指的是,前一次任务结束与下一个任务开始的间隔。如:@Scheduled(fixedDelay = 5*1000 ),表示第一个任务结束后,过5秒后,开始第二个任务。
-
fixedRate:指定两次任务执行的时间间隔(毫秒),此时间间隔指的是,前一个任务开始与下一个任务开始的间隔。如:@Scheduled(fixedRate= 5*1000 ),表示第一个任务开始后(第一个任务执行时间小于5秒),第一个任务开始后的第6秒,开始第二个任务。如果第一个任务执行时间大于5秒,第一个任务结束后,直接开始第二个任务。
-
cron:使用表达是进行任务的执行,例如:@Scheduled(cron = "0/15 * * * * ? ")每隔15秒执行一次
我一般都是采用cron表达式的方式来进行定时,相信大家用的也不少,具体就不再赘述,百度一下可以在线根据你想要的时间来生成cron表达式
其实这时基本已经可以使用定时任务了,但是使用中可能还会遇到一个问题,这时你所有的定时任务使用的是统一线程
3.线程池
增加如下配置就设置了线程池的大小,可以根据项目的定时任务多少进行配置,这样的话,定时任务之间就不会相互影响
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(10); //指定线程池大小
}
}