Spring支持的定时任务

1. Spring task

spring task是spring3以上版本自带的定时任务,实现定时任务的功能时,需要引入spring-context包,目前它支持:xml 和注解两种方式。
使用步骤:

  1. pom中引入spring-context相关依赖
  2. springboot启动类加上@EnableScheduling注解
  3. 使用@Scheduled注解定义规则
@Service
public class SpringTaskTest {

    @Scheduled(cron = "${spring.task.cron}")
    public void fun() {
        System.out.println("doSomething");
    }
}
  1. properties文件中配置cron表达式

cron规则:

在spring4以上的版本中,cron表达式包含6个参数:[秒] [分] [时] [日期] [月] [星期]
支持的符号:

  • *:表示任何时间触发任务
  • ,:表示指定的时间触发任务
  • -:表示一段时间内触发任务
  • /:表示从哪一个时刻开始,每隔多长时间触发一次任务
  • ?:表示用于月中的天和周中的天两个子表达式,表示不指定值

cron表达式参数具体含义:

  1. 秒,取值范围:0-59,支持*、,、-、/。
  2. 分,取值范围:0-59,支持*、,、-、/。
  3. 时,取值范围:0-23,支持*、,、-、/。
  4. 日期,取值范围:1-31,支持*、,、-、/。比秒多了?,表示如果指定的星期触发了,则配置的日期变成无效。
  5. 月,取值范围:1-12,支持*、,、-、/。
  6. 星期,取值范围:1~7,1代表星期天,6代表星期六,其他的以此类推。支持*、,、-、/、?。比秒多了?,表示如果指定的日期触发了,则配置的星期变成无效。

cron表达式使用示例:

  • 0 0 0 1 * ? 每月1号零点执行
  • 0 0 2 * * ? 每天凌晨2点执行
  • 0 0 2 * * ? 每天凌晨2点执行
  • 0 0/5 11 * * ? 每天11点-11点55分,每隔5分钟执行一次
  • 0 0 18 ? * WED 每周三下午6点执行

优缺点:
优点:spring框架自带的定时功能,springboot做了非常好的封装,开启和定义定时任务非常容易,支持复杂的cron表达式,可以满足绝大多数单机版的业务场景。单个任务时,当前次的调度完成后,再执行下一次任务调度。
缺点:默认单线程,如果前面的任务执行时间太长,对后面任务的执行有影响。不支持集群方式部署,不能做数据存储型定时任务。

spring quartz

quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,是由java开发的一个开源的任务日程管理系统。
quartz功能:

  • 作业调度:调用各种框架的作业脚本,例如shell,hive等。
  • 定时任务:在某一预定的时刻,执行你想要执行的任务。

quartz包含的主要接口如下:

  • Scheduler 代表调度容器,一个调度容器中可以注册多个JobDetail和Trigger。
  • Job 代表工作,即要执行的具体内容。
  • JobDetail 代表具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容。
  • JobBuilder 用于定义或构建JobDetail实例。
  • Trigger 代表调度触发器,决定什么时候去调。
  • TriggerBuilder 用于定义或构建触发器。
  • JobStore 用于存储作业和任务调度期间的状态。

使用步骤:

  1. pom引入quartz依赖:spring-boot-starter-quartz
  2. 创建真正的定时任务执行类,该类继承QuartzJobBean
  3. 创建调度程序JobDetail和调度器Trigger
@Configuration
public class QuartzConfig {
    @Value("${spring.quartz.cron}")
    private String testCron;

    /**
     * 创建定时任务
     */
    @Bean
    public JobDetail quartzTestDetail() {
        JobDetail jobDetail = JobBuilder.newJob(QuartzTestJob.class)
                .withIdentity("quartzTestDetail", "QUARTZ_TEST")
                .usingJobData("userName", "susan")
                .storeDurably()
                .build();
        return jobDetail;
    }

    /**
     * 创建触发器
     */
    @Bean
    public Trigger quartzTestJobTrigger() {
        //每隔5秒执行一次
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(testCron);

        //创建触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .forJob(quartzTestDetail())
                .withIdentity("quartzTestJobTrigger", "QUARTZ_TEST_JOB_TRIGGER")
                .withSchedule(cronScheduleBuilder)
                .build();
        return trigger;
    }
}
  1. 在properties文件中配置spring.quartz.cron=*/5 * * * * ?
    CronTrigger配置格式:[秒] [分] [小时] [日] [月] [周] [年]
    spring quartz跟spring task的cron表达式规则基本一致,只是spring4以上的版本去掉了后面的年,而quartz的CronTrigger的年是非必填的

优缺点:
优点:默认是多线程异步执行,单个任务时,在上一个调度未完成时,下一个调度时间到时,会另起一个线程开始新的调度,多个任务之间互不影响。支持复杂的cron表达式,它能被集群实例化,支持分布式部署。
缺点:相对于spring task实现定时任务成本更高,需要手动配置QuartzJobBean、JobDetail和Trigger等。需要引入了第三方的quartz包,有一定的学习成本。不支持并行调度,不支持失败处理策略和动态分片的策略等。

posted @ 2021-04-14 18:53  Abserver  阅读(691)  评论(0)    收藏  举报