Quartz

1 简介

Quartz是一个完全由java编写的开源作业调度框架。

通过触发器设置作业定时运行规则、控制作业的运行时间。

Quartz定时器的作用很多,比如定时发送信息、定时器生成报表。

2 核心组件

2.1 Quartz框架的核心对象

  • Scheduler – 核心调度器

  • Job – 任务

  • JobDetail – 任务描述

  • Trigger -- 触发器


 

Job是一个接口,借口中只有一个execute()方法,具体的任务类需要实现该接口的该方法。

public interface Job {
   void execute(JobExecutionContext context)
       throws JobExecutionException;

}

 


 

2.2 对象之间的关系

3 使用Quartz之前的准备

3.1 建立一个Maven项目

3.2 引入quartz依赖

使用quartz,我们仅仅需要在maven的pom文件中添加依赖即可。我使用的是现在最新的一个版本2.3.0。

<dependency>
   <groupId>org.quartz-scheduler</groupId>
   <artifactId>quartz</artifactId>
   <version>2.3.0</version>
</dependency>

 

4 编写第一个Quartz任务案例

这个任务主要是每2秒打印一次HelloQuartz。

先实现一下这个基本的Quartz的任务再来介绍一下Quartz的3个重要组成,JobDetail,Trigger,Scheduler。

4.1 创建一个类HelloJob.java

这个类是我们具体要实现的任务(打印Hello Quartz)

package com.example;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

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

/**
* @Auther: wuyilong
* @Date: 2019/3/20 09:27
* @Description: 打印Hello Quartz
*/
public class HelloJob implements Job {
   
   @Override
   public void execute(JobExecutionContext context) throws JobExecutionException {
       Date date = new Date();
       SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       System.out.println(sf.format(date));
       // 具体的任务
       System.out.println("Hello Quartz");

  }
}

4.2 创建HelloScheduler.java,这个是具体触发我们的任务

创建HelleScheduler的步骤:

  1. 创建调度工厂();    //工厂模式

  2. 根据工厂取得调度器实例();   //工厂模式

  3. Builder模式构建子组件<Job,Trigger>    // builder模式, 如JobBuilder、TriggerBuilder、DateBuilder

  4. 通过调度器组装子组件 调度器.组装<子组件1,子组件2...>   //工厂模式

  5. 调度器.start();   //工厂模式


 

public class HelloScheduler {
   
   public static void main(String[] args) throws SchedulerException {
       //创建一个jobDetail的实例,将该实例与HelloJob Class绑定
       JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build();
       //创建一个Trigger触发器的实例,定义该job立即执行,并且每2秒执行一次,一直执行
       SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
       //创建schedule实例
       StdSchedulerFactory factory = new StdSchedulerFactory();
       Scheduler scheduler = factory.getScheduler();
       scheduler.start();
       scheduler.scheduleJob(jobDetail,trigger);

  }
}

 

5 cron表达式编写规则

5.1 Quartz Cron 表达式支持7个域 ,分别是秒/分/时/日/月/周/年。

名称是否必须允许值特殊字符
0-59 , - * /
0-59 , - * /
0-23 , - * /
1-31 , - * ? / L W C
1-12 或 JAN-DEC , - * /
1-7 或 SUN-SAT , - * ? / L C #
空 或 1970-2099 , - * /

 

5.2 官方的一些案例

表示式说明
0 0 12 * * ? 每天12点运行
0 15 10 ? * * 每天10:15运行
0 15 10 * * ? 每天10:15运行
0 15 10 * * ? * 每天10:15运行
0 15 10 * * ? 2008 在2008年的每天10:15运行
0 * 14 * * ? 每天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59。
0 0/5 14 * * ? 每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55。
0 0/5 14,18 * * ? 每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次。
0 0-5 14 * * ? 每天14:00点到14:05,每分钟运行一次。
0 10,44 14 ? 3 WED 3月每周三的14:10分到14:44,每分钟运行一次。
0 15 10 ? * MON-FRI 每周一,二,三,四,五的10:15分运行。
0 15 10 15 * ? 每月15日10:15分运行。
0 15 10 L * ? 每月最后一天10:15分运行。
0 15 10 ? * 6L 每月最后一个星期五10:15分运行。
0 15 10 ? * 6L 2007-2009 在2007,2008,2009年每个月的最后一个星期五的10:15分运行。
0 15 10 ? * 6#3 每月第三个星期五的10:15分运行。

6 SpringBoot2集成Quartz


6.1 Maven文件

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

6.2 编写任务类

package com.example.task;

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

/**
* @Auther: wuyilong
* @Date: 2019/3/20 10:32
* @Description:
*/
public class MjtTask extends QuartzJobBean {
   @Override
   protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
       System.out.println("开始定时计时");
  }
}

6.3 编写配置类

package com.example.config;

import com.example.task.MjtTask;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* @Auther: wuyilong
* @Date: 2019/3/20 10:33
* @Description:
*/
@Configuration
public class QuartzConfig {

   @Bean
   public JobDetail uploadTaskDetail() {
       return JobBuilder.newJob(MjtTask.class).withIdentity("mjtTask").storeDurably().build();
  }

   @Bean
   public Trigger uploadTaskTrigger() {
       CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("*/5 * * * * ?");
       return TriggerBuilder.newTrigger().forJob(uploadTaskDetail()).withIdentity("mjtTask")
              .withSchedule(scheduleBuilder).build();
  }
}

6.4 运行结果

 

原文地址:https://www.cnblogs.com/wylwyl/p/10563586.html