SpringBoot提供了任务调度功能,可以指定启动服务器立刻执行某些任务逻辑,或指定时间调用某些任务逻辑。
Tomcat服务器启动立刻执行某些任务
SpringBoot提供了ApplicationRunner和CommandLineRunner接口,实现任何一个即可。
1.ApplicationRunner
@Component
@Order(2)
public class MyTask1 implements ApplicationRunner{
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("启动服务器自动执行任务1 "+new Date()); } }
2.CommandLineRunner
@Component
@Order(1)
public class MyTask2 implements CommandLineRunner{
@Override
public void run(String… args) throws Exception {
System.out.println("启动服务器自动执行任务2 "+new Date());
Thread.sleep(3000);
String s = null;
s.length(); } }
总结:多个任务可以使用@Order定义调度顺序,从1,2,3,4…;多个任务采用单线程同步模式执行。
如果需要多个任务需要异步执行调用,可以使用@EnableAsync和@Async标记。
@Component
@EnableAsync
public class MyTask3 {
@Async
public void run1() throws Exception {
System.out.println("启动服务器自动执行任务1 "+new Date());
Thread.sleep(2000);
System.out.println("任务1结束 "+ new Date()); }
@Async
public void run2() throws Exception {
System.out.println("启动服务器自动执行任务2 "+new Date());
Thread.sleep(3000);
System.out.println("任务2结束 "+ new Date()); } }
提示:在需要的时机注入MyTask3任务对象,调用run1、run2方法。
Tomcat服务器启动后定时执行任务调度
在以前经常使用Quartz工具来实现任务调度。后期Spring框架引入Schedule任务模块,实现了任务调度功能。(Spring+Quartz、Spring Schedule)
1.Spring Schedule模块应用
@Component
@EnableScheduling
public class MyTask4 {
// @Scheduled(fixedRate=3000,initialDelay=5000)
// public void run1() {
// System.out.println("执行任务4处理 "+new Date());// }
// @Scheduled(fixedRate=1000)
// public void run2() {
// System.out.println("执行任务5处理 "+new Date());// }
@Scheduled(cron="0/5 * * * * ?")
public void run3() {
System.out.println("执行任务6处理 "+new Date()); } }
cron表达式(由7部分构成,格式为“秒 分 时 日 月 星期 年”)
2.Spring Quartz整合应用
编写任务组件
@Component
public class HelloBean{
public void execute() throws JobExecutionException {
System.out.println("执行Quartz任务 " + new Date()); } }
配置JobDetail、CronTrigger、ScheduleFactoryBean组件
@Configuration
public class QuartzConfiguration {
@Autowired
private HelloBean hello;
@Bean//配置jobDetail对象
public MethodInvokingJobDetailFactoryBean helloJobDetail() {
MethodInvokingJobDetailFactoryBean jobDetailFactoryBean =
new MethodInvokingJobDetailFactoryBean();
// 是否设置并发执行
jobDetailFactoryBean.setConcurrent(false);
jobDetailFactoryBean.setTargetObject(hello);
jobDetailFactoryBean.setTargetMethod("execute");
return jobDetailFactoryBean; }
@Bean
public CronTriggerFactoryBean helloJobTrigger(JobDetail jobDetail) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setCronExpression("0/3 * * * * ?");
trigger.setJobDetail(jobDetail);
return trigger; }
@Bean //可以省略,由QuartzAutoConfiguration自动配置替代
public SchedulerFactoryBean schedulerFactoryBean(Trigger… cornTriggerFacrotyBean) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
bean.setSchedulerName("QUARTZ");
bean.setTriggers(cornTriggerFacrotyBean);
//bean.setStartupDelay(5);
return bean; } }
转自:https://www.jianshu.com/p/abea73683fa1