想要定时或周期性的执行一些任务(比如:定时清除系统的缓存;信用卡每月25号自动扣款;再或者每天12点从网址扒拉一些每日更新的爱情动作片…),quartz 就是干这种事情的( quartz :别污蔑我)。没有其他的定时任务方案了吗?有, quartz 功能更加强大。
1、TimerTask (jdk 自带)
2、ScheduledExecutorService (基于线程池设计,jdk 自带)
3、Spring Task(spring 3.0 自带)
4、quartz(最横的一个)

本篇目的:了解 quartz 和与 springboot 的集成

一、quartz 组件

先参考一个 spring 基于 xml 形式配置 quartz 的示例,看明白他基本就差不多了
在这里插入图片描述

1、Job 任务

我们要定时执行某件事情,然后我们把它写成一个 java 类,这就是 Job

2、JobDetail 任务详情

具体任务类有了,还需要任务详情类( JobDetail )去构建 Job。一个任务详情对应一个任务,自古牛逼多反射。

3、Trigger 触发器

你把任务放进去了,什么时候执行?这就是触发器的作用。它根据你 cron 表达式的时间去触发任务详情。一个触发器对应一个任务详情。

4、Scheduler 调度器

调度器可以调度多个调度器,也就是可以调度多个任务。

二、springboot 集成 quartz

1、配置文件 pom.xml

在 pom.xml 中加入相关依赖:

	<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>

2、开发

1)、编写 Job 任务类
——DownloadJob.java

package com;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

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

public class DownloadJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String time = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
        System.out.println(time + "===> 正在下载最新更新的爱情动作片...");
    }
}

2)、编写 quartz 配置类
该配置类配置 JobDetail 、Trigger(Scheduler)
——QuartzConfig.java

package com;

import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuartzConfig {
    //构建 JobDetail
    @Bean
    public JobDetail downloadDetail() {
        return JobBuilder.newJob(DownloadJob.class) //具体任务类
                //给 JobDetail 起一个 id, 不写也会自动生成唯一的 TriggerKey
                .withIdentity("downloadJobDetail")
                //JobDetail 内部的一个 map, 可以存储有关 Job 的数据, 这里的数据
                // 可通过 Job 类中executeInternal方法的参数进行获取
                .usingJobData("job_download","download movie")
                .storeDurably()  //即使没有Trigger关联时也不删除该Jobdetail
                .build();
    }
    //构建 Trigger 及 Scheduler
    @Bean
    public Trigger downloadTrigger() {
        return TriggerBuilder.newTrigger()
                .forJob(downloadDetail())  //关联上面的 jobDetail
                .withIdentity("downloadTrigger")
                .usingJobData("trigger_download","download")
                //cron 表达式设置每隔 5 秒执行一次
                .withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ? *"))
                .build();
    }
}

3)、测试
启动测试类观察控制台输出即可看到结果
在这里插入图片描述
这有的撸友就郁闷了,这 cron 表达式怎么搞?莫急

cron 表达式在线生成:在线 cron 表达式生成器

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐