天天看点

datax 定时执行多个job_Spring Boot如何整合Quartz 实现定时任务

在项目开发中,经常需要定时任务来后台处理业务,比如定时生成数据报表、生成对账单、数据监控等。Spring Boot 中有两种方案可以选择,第一种是 Spring Boot 内置的注解方式实现,这个方式之前介绍过了,可以看我这篇文章《Spring Boot入门系列(八)整合定时任务Task,一秒搞定定时任务》,如果需要更复杂的应用场景那么就需要Quartz 实现, Quartz是目前最完善的定时任务框架。接下来一起学习Spring Boot如何整合Quartz 实现定时任务。

datax 定时执行多个job_Spring Boot如何整合Quartz 实现定时任务

一、 Quartz 介绍

Quartz 是非常流行的开源任务调度管理,它是由 Java 开发,具有使用灵活、配置简单的特点。能够实现复杂的应用场景下的任务调度管理。

Quartz 中,有几个非常重要的概念: Job(任务)、 JobDetail(任务信息)、 Trigger(触发器)和Scheduler(调度器),只有熟悉这几个概念,才能明白 Quartz 怎么用。

(1) Job:是个接口,只有一个 execute方法,在实现接口的execute 方法中编写所需要定时执行的 功能;Job 运行时的信息保存在 JobDataMap 实例中。

(2) JobDetail: Quartz 每次调度 Job 时,都创建一个 Job 实例。它主要记录 Job 任务的相关基本信息(如 Job 名字、描述、关联监听器等信息),以便运行时通过 newInstance() 的反射机制实例化 对应的Job任务。

(3) Trigger:是一个触发类,描述触发 Job 执行的触发规则,主要有 SimpleTrigger 和 CronTrigger 这两个类。SimpleTrigger 主要用于任务以固定时间间隔周期执行,而 CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案,如:设置任务每周一到周五的 15: 00~ 16: 00 执行等。

(4) Scheduler:就相当于一个独立运行容器,装载着任务和触发器 , 可以将 Trigger 和 JobDetail 注册到 Scheduler 中, Scheduler 定义了多个接口方法,允许外部通过组及名称访问和控制容器中 Trigger 和 JobDetail。

四者其关系如下图所示:

datax 定时执行多个job_Spring Boot如何整合Quartz 实现定时任务

二、整合Quartz

Spring Boot 2.0 提供了 spring-boot-starter-quartz 组件,它集成 Quartz 框架,让我们在项目中使用 Quartz 变得非常简单。

1、配置 pom.xml

         org.springframework.boot         spring-boot-starter-quartz
           

Spring Boot 整合 quartz 非常简单,只需在pom.xml 文件中增加 quartz 依赖即可,无需其他配置。

三、创建简单任务

1、首先定义一个 Job 需要继承 QuartzJobBean,示例中 Job 定义一个变量 Name,用于在定时执行的时候传入。

public class SampleJob extends QuartzJobBean {         private String name;         public void setName(String name) {                   this.name = name;         }         @Override         protected void executeInternal(JobExecutionContext context)                            throws JobExecutionException {                   System.out.println(String.format("Hello %s!", this.name));         }       }
           

2、然后构建 JobDetail,并且构建时传入 name 属性的值,构建 JobTrigger 和 scheduleBuilder,最后使用Scheduler 启动定时任务。

@Configurationpublic class SampleScheduler {         @Bean         public JobDetail sampleJobDetail() {                   return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob")                                     .usingJobData("name", "World").storeDurably().build();         }         @Bean         public Trigger sampleJobTrigger() {                   SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()                                     .withIntervalInSeconds(2).repeatForever();                   return TriggerBuilder.newTrigger().forJob(sampleJobDetail())                                     .withIdentity("sampleTrigger").withSchedule(scheduleBuilder).build();         }}
           

启动项目后每隔两秒输出:

Hello World!Hello World!Hello World!. . .
           

JobBuilder 构构造函数,只能通过 JobBuilder 的静态方法 newJob() 生成成 JobBuilder 实例。

withIdentity 方法可以传入两个参数 withIdentity(String name,String group) 来定义 TriggerKey,也可以不设置,像上一示例中会自动生成一个独一无二的 TriggerKey 来区分不同的 Trigger。

以上是创建简单的任务,任务以固定时间间隔周期执行。

四、创建cron定时任务

CronSchedule 可以设置更灵活的使用方式,定时设置可以参考上面的 cron 表达式。

1、首先定义两个 Job

public class ScheduledJob implements Job {     @Override     public void execute(JobExecutionContext context)                        throws JobExecutionException{               System.out.println("schedule job1 is running ...");     }}
           

2、构建 jobDetail、 CronTrigger,最后使用 scheduler 关联 jobDetail 和CronTrigger。 scheduleJob1 设置每间隔 6 秒执行一次。

private void scheduleJob1(Scheduler scheduler) throws SchedulerException{ JobDetail jobDetail = JobBuilder.newJob(ScheduledJob.class) .withIdentity("job1", "group1").build();CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/6 * * * * ?");CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail,cronTrigger);}
           

CronScheduleBuilder.cronSchedule("0/6 * * * * ?"),按照 cron 表达式设置定时任务的执行周期。

3、触发定时任务

public void scheduleJobs() throws SchedulerException {         Scheduler scheduler = schedulerFactoryBean.getScheduler();         scheduleJob1(scheduler);         scheduleJob2(scheduler);}
           

最后

以上,就把Spring Boot集成Quartz,实现定时任务。还是比较简单的。还有一个比较重要的点是cron 表达式。这个后面会单独介绍。

这个系列课程的完整源码,也会提供给大家。大家私信我(章为忠学架构)。获取这个系列课程的完整源码。

推荐阅读:

Spring Boot入门系列(八)整合定时任务Task,一秒搞定定时任务

Spring Boot入门系列(十五)Spring Boot 开发环境热部署的配置

Spring Boot 使用JdbcTemplate操作数据库,配置多数据源

Maven快速入门(二)手动创建maven项目hellomaven

Maven快速入门(一)Maven介绍及环境搭建

史上最强《Java 开发手册》泰山版,阿里出品,必属精品

Spring Boot入门系列(十三)如何实现事务,极简版!

继续阅读