Spring boot定时器之Scheduled Task
Scheduled task是Spring 内置的一个定时器,他可以不想Quartz那样麻烦的配置;Scheduled task有三种使用的方式,一种是在注解上直接使用task定时任务,第二种是可以进行更改定时任务的时间,第三种是可以进行手动启动定时任务和停止定时任务以及更改定时任务的时间;
第一种,spring-boot使用注解的方式实现定时任务
/**
* spring boot时间调度器
* @author Admin
*
*/
@Configuration
@EnableScheduling
public class MyTask {
/**
* 每一秒中执行以下改方法
* cron是用来指定执行的 秒,分钟,日期等
*/
@Scheduled(cron="0/10 * * * * *")
public void test1(){
System.out.println("test1");
}
}
第二种:可以更改任务执行的时间
empty@RestController
@EnableScheduling
public class ChangeTask implements SchedulingConfigurer{
//时间:秒,分钟,小时,日期,月份,星期,年
private String expression="0/5 * * * * *";
//编写更改调度时间的方法
@RequestMapping("change")
public String changeExpression(){
expression="0/10 * * * * *";
return "changeExpression";
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
//定时任务要执行的方法
Runnable task=new Runnable() {
@Override
public void run() {
System.out.println("changeTask"+new Date());
}
};
/**
* 调度实现的时间控制
*/
Trigger trigger=new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
CronTrigger cronTrigger=new CronTrigger(expression);
return cronTrigger.nextExecutionTime(triggerContext);
}
};
scheduledTaskRegistrar.addTriggerTask(task, trigger);
}
}
第三种可以手动启动或者终止定时任务获取更改定时任务执行的时间
empty/**
* 利用线程池实现任务调度
* Task任务调度器可以实现任务的调度和删除
* 原理:
* 实现一个类:ThreadPoolTaskScheduler线程池任务调度器,能够开启线程池进行任务调度
* ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduleFuture,
* 在这个方法中添加两个参数一个是Runable:线程接口类,和CronTrigger(定时任务触发器)
* 在ScheduleFuture中有一个cancel可以停止定时任务
* @author Admin
*
* Scheduled Task是一种轻量级的任务定时调度器,相比于Quartz,减少了很多的配置信息,但是Scheduled Task
* 不适用于服务器集群,引文在服务器集群下会出现任务被多次调度执行的情况,因为集群的节点之间是不会共享任务信息的
* 每个节点的定时任务都会定时执行
*
*/
@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("startTest")
public String StartTest(){
/**
* 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不适用于服务器集群,引文在服务器集群下会出现任务被多次调度执行的情况,因为集群的节点之间是不会共享任务信息的,每个节点的定时任务都会定时执行