SpringBoot提供了任务调度功能,可以指定启动服务器立刻执行某些任务逻辑,或指定时间调用某些任务逻辑。

Tomcat服务器启动立刻执行某些任务

SpringBoot提供了ApplicationRunnerCommandLineRunner接口,实现任何一个即可。

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+QuartzSpring 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