springboot定时任务实现
1、添加定时任务
- 1、启动类中开启定时任务:@EnableScheduling
- 2、新建任务类,加入spring.在方法上添加注解:@Scheduled
@Component
public class TestJob {
private static final Logger log = LoggerFactory.getLogger(TestJob.class);
private static int count;
@Scheduled(cron = "0/10 * * * * ?")
public void cron() {
log.info("spring anno task execute times {}", count++);
}
}
@Scheduled所支持的参数:
- cron:cron表达式,指定任务在特定时间执行;
- fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
- fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
- fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
- fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
- initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
- initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
- zone:时区,默认为当前时区,一般没有用到。
2、动态修改cron 参数:
@RestController
public class TaskCronChange implements SchedulingConfigurer {
//原cron
private String expression = "* * * * * *";
//动态修改
@RequestMapping("changeExpression")
public void changeExpression() {
expression = "0/10 * * * * *";
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
//执行的任务
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
CronTrigger trigger = new CronTrigger(expression);
return trigger.nextExecutionTime(triggerContext);
}
});
}
}
3、动态添加 删除定时任务
- ThreadPoolTaskScheduler,线程任务调度类,能开启线程池进行任务调度。
- ThreadPoolTaskScheduler.Schedule()方法会创建一个定时计划ScheduledFuture。这个计划可以停止定时任务。
@RestController @EnableScheduling @RequestMapping("/dynamicTask") public class DynamicTask { @Autowired ThreadPoolTaskScheduler poolTaskScheduler; private ScheduledFuture<?> schedule; private String cron = "* * * * * *"; @Bean private ThreadPoolTaskScheduler poolTaskScheduler() { return new ThreadPoolTaskScheduler(); } @RequestMapping("startTask") private String startTask() { schedule =poolTaskScheduler.schedule(new MyRunnable(), new CronTrigger(cron)); return "startTask"; } @RequestMapping("stopTask") private String stopTask() { if (schedule != null) { schedule.cancel(true); } return "stopTask"; } @RequestMapping("changeCron") private String changeCron() { stopTask(); cron = "0/5 * * * * *"; startTask(); return "change Cron"; } private class MyRunnable implements Runnable { @Override public void run() { System.err.println("DynamicTask run" + new Date()); } } }