Spring boot定时器 - Scheduled Task
Scheduled task是Spring 内置的一个定时器,具有配置简单的优点;
三种使用形式
Scheduled task有三种使用的方式
- 直接使用注解。
- 可更改定时任务的时间。
- 可以进行手动启动定时任务和停止定时任务以及更改定时任务的时间。
直接使用注解形式
@Configuration
@EnableScheduling
public class MyTask {
/**
* 每一秒中执行以下改方法
* cron是用来指定执行的 秒,分钟,日期等
*/
@Scheduled(cron="0/10 * * * * *")
public void startScheduled(){
System.out.println("定时任务启动");
}
}
可以更改任务执行的时间
@Component
@Configuration
@EnableScheduling
public class ScheduledTask implements SchedulingConfigurer{
//时间:秒,分钟,小时,日期,月份,星期,年
private String corn="0/5 * * * * *";
public String getCorn(){
return this.corn;
}
public void setCorn(String corn){
this.corn = corn;
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
//定时任务要执行的方法
Runnable task=new Runnable() {
@Override
public void run() {
System.out.println("ScheduledTask"+new Date());
}
};
/**
* 调度实现的时间控制
*/
Trigger trigger=new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
CronTrigger cronTrigger=new CronTrigger(corn);
return cronTrigger.nextExecutionTime(triggerContext);
}
};
scheduledTaskRegistrar.addTriggerTask(task, trigger);
}
}
可以手动启动或者终止定时任务获取更改定时任务执行的时间
/**
* 利用线程池实现任务调度
* Task任务调度器可以实现任务的调度和删除
* 原理:
* 实现一个类:ThreadPoolTaskScheduler线程池任务调度器,能够开启线程池进行任务调度
* ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduleFuture,
* 在这个方法中添加两个参数一个是Runable:线程接口类,和CronTrigger(定时任务触发器)
* 在ScheduleFuture中有一个cancel可以停止定时任务
*
*/
@RestController
@EnableScheduling
public class DynamicTask {
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private ScheduledFuture<?> future;
@Bean
public ThreadPoolTaskScheduler trPoolTaskScheduler(){
return new ThreadPoolTaskScheduler();
}
/**
* 1,定义一个方法实现定时任务的启动
* 2,定义一个方法实现用于终止定时任务
* 3,修改定时任务时间:changeCron
*/
/**
* 启动定时器
* @return
*/
@RequestMapping("start")
public String Start(){
/**
* task:定时任务要执行的方法
* trigger:定时任务执行的时间
*/
future=threadPoolTaskScheduler.schedule(new myRunable(),new CronTrigger("0/5 * * * * *") );
return "startTest";
}
/**
* 停止定时任务
* @return
*/
@RequestMapping("endTask")
public String endTask(){
if(future!=null){
future.cancel(true);
}
System.out.println("endTask");
return "endTask";
}
/**
* 改变调度的时间
* 步骤:
* 1,先停止定时器
* 2,在启动定时器
*/
@RequestMapping("changeTask")
public String changeTask(){
//停止定时器
endTask();
//定义新的执行时间
future=threadPoolTaskScheduler.schedule(new myRunable(),new CronTrigger("0/10 * * * * *") );
//启动定时器
StartTest();
System.out.println("changeTask");
return "changeTask";
}
/**
* 定义定时任务执行的方法
* @author Admin
*
*/
public class myRunable implements Runnable{
@Override
public void run() {
System.out.println("定时任务要执行的方法"+new Date());
}
}
}
缺点
使用Scheduled Task的弊端就是不适用于分布式集群的操作,Scheduled Task是一种轻量级的任务定时调度器,相比于Quartz,减少了很多的配置信息,但是Scheduled Task不适用于服务器集群,在分布式或集群环境中,每个节点都会执行一次定时任务,会照成任务的重复执行。