SpringBoot创建定时任务的三种方法:基于注解(@Scheduled) 基于接口(SchedulingConfigurer) 基于注解设定多线程定时任务

SpringBoot创建定时任务有三种方式:

  • 基于注解(@Scheduled)
  • 基于接口(SchedulingConfigurer)
  • 基于注解设定多线程定时任务

此任务使用了Springboot基于注解(@Scheduled)的调度器,所以我们将重点讲解基于注解(@Scheduled)的调度器,其他调度器可以参照,比对学习。

@Scheduled注解默认是串行的,单线程,当开启多个任务时,任务的执行时间会受上一个任务执行时间的影响

@Configuration
@EnableScheduling    //开启调度器
public class WorkOrderScheduleTask {
    //每10秒执行一次
    @Scheduled(cron = "0/10 * * * * ?")
    private void workOrderSchedulerCron() {
        System.out.println("cron:每10秒执行一次......");
    }
}

一个完整的controller文件

package com.jiker.workorderms.controller;

import com.jiker.workorderms.service.WorkOrderService;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Configuration
@EnableScheduling //1.开启调度器
public class WorkorderPlanSchedulerController{
    WorkOrderService workOrderService=new WorkOrderService();
    SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date=sdf.format(new Date());

    //2.每天凌晨0点启动工单计划调度器
    @Scheduled(cron = "0 0 0 * * ?")
    private void workOrderScheduler()throws ParseException {
        System.out.println(date+":工单计划调度器启动");
        workOrderService.produceWorkOrder();
        System.out.println(date+":工单计划调度器结束");
    }
}

@Scheduled 除了cron外,还提供另外三种方式:

fixedRate
fixedDelay
initialDelay

①、cron表达式可以定制化执行任务,但是执行的方式是与fixedDelay相近的,也是会按照上一次方法结束时间开始算起。

②、fixedDelay控制方法执行的间隔时间,是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次。

@Configuration
@EnableScheduling    //开启调度器
public class WorkOrderScheduleTask {
    //每10秒执行一次
    @Scheduled(fixedDelay = 10000)
    private void workOrderSchedulerFixedDelay() {
        System.out.println("fixedDelay:每10秒执行一次......");
    }
}

③、fixedRate是按照一定的速率执行,是从上一次方法执行开始的时间算起,如果上一次方法阻塞住了,下一次也是不会执行,但是在阻塞这段时间内累计应该执行的次数,当不再阻塞时,快速把这些全部执行掉,而后再按照固定速率继续执行。

@Configuration
@EnableScheduling    //开启调度器
public class WorkOrderScheduleTask {
    //每10秒执行一次
    @Scheduled(fixedRate = 10000)
    private void workOrderSchedulerFixedRate() {
        System.out.println("fixedRate:每10秒执行一次......");
    }
}

④、initialDelay = 10000 表示在容器启动后,延迟10秒后再执行一次定时器。

@Configuration
@EnableScheduling    //开启调度器
public class WorkOrderScheduleTask {
    //容器启动后,延迟10秒后再执行一次定时器,以后每10秒再执行一次该定时器。
    @Scheduled(initialDelay = 10000, fixedRate = 10000)
    private void workOrderSchedulerInitialDelay() {
        System.out.println("initialDelay:每10秒执行一次......");
    }
}

你可能感兴趣的:(SpringBoot创建定时任务的三种方法:基于注解(@Scheduled) 基于接口(SchedulingConfigurer) 基于注解设定多线程定时任务)