Quartz入门

Posted Tang.Mr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Quartz入门相关的知识,希望对你有一定的参考价值。

1.Quartz的概念

Quartz就是一个基于Java实现的任务调度框架,用于执行你想要执行的任何任务。
Quartz是OpenSymphony开源组织在Job scheduling(定时调度)领域的开源项目,它可以与J2EE和J2SE应用程序相结合也可以单独使用。

Quartz是开源且具有丰富特性的任务调度库,能够集成任何的Java应用。它能创建简单的或者复杂的调度任务,以执行上十,上百,上千,上万的任务。任务job被定义为标准的Java组件。能工执行任何你想要实现的功能。Quartz调度框架包含许多企业级的特性,如JTA事务,集群的支持。

官网:http://www.quartz-scheduler.org/

2.Quartz运行环境

  • Quartz可以运行嵌入在另一个独立的应用程序中
  • Quartz可以在应用程序服务器(或servlet容器)内被实例化,bin参与事务
  • Quartz可以作为一个独立的程序运行(其自己的java虚拟机内),可以通过RMI使用
  • Quartz可以被实例化,作为独立的项目集群(负载平衡和故障转移功能),用于作业执行

3.Quartz使用的设计模式

  • Builder模式
  • Factory模式
  • 组件模式
  • 链式编程

4.Quartz学习的核心概念

  • 任务Job

job就是你想实现的任务类,每一个job必须实现org.quartz.job接口,且只需实现接口定义的execute()方法

  • 触发器Trigger

Trigger为你执行任务的触发器(定时)
Trigger主要包含两个SimpleTrigger和CronTrigger两种

  • 调度器Scheduler

Scheduler为定时任务调度,它会将任务Job及触发器Trigger整合起来,负责基于Trigger设定的时间来执行Job

5.Quartz的体系结构

6.Quartz的几个常用API

  • Scheduler:用于定时调度程序交互的主程序接口。Scheduler调度程序:任务执行计划表,只有安排进执行计划的任务Job【通过scheduler.scheduleJob方法安排进执行任务】,当它预先定义的执行时间到了的时候(任务出发trigger)该任务才会被执行

  • Job:预先定义的,希望在未来某个使劲能被调度程序执行的任务类,可自定义

  • JobDetail:使用JobDetail来定义定时任务的实例,JobDetail实例是通过JobBuilder类创建的

  • JobDataMap:可以包含不限量(序列化的)的数对象,在Job实例执行的时候,可以使用其中的数据;JobDataMap是Java Map接口的一个实现,额外增加了一些便于存取基本类型数据的方法

  • Trigger:触发器,Trigger对象是用来触发执行Job的。当调度一个Job时,我们实例一个触发器然后调整他的属性来满足Job执行的条件。表明任务在什么时候会执行。【定义了一个已经被安排的任务将会在什么时候执行的时间条件】

  • JobBuilder:用于声明一个任务实例,也可以定义关于该任务的详情比如任务名,组名等。通过JobBuilder声明的实例将会作为一个实际执行的任务。

  • TriggerBuilder:触发器创建器,用于创建触发器trigger实例

  • JobListener、TriggerListener、SchedulerListener监听器,用于对组件的监听

7.入门案例

构建一个任务类实现Job接口,重写execute(执行方法)方法,在执行方法中编写定时调度需要实现的逻辑。
创建一个main方法,在main方法中构建任务实例和处方实例有调度器实例进行绑定并开启任务。

7.1.pom.xml

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

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

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
</dependency>

7.2.任务类

/**
 * @Author ScholarTang
 * @Date 2021/7/13 10:45
 * @Desc 任务类
 */
@Slf4j
public class HelloJob implements Job 
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException 
        log.info(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) + " | 任务被执行了");
    

7.3.调度器

/**
 * @Author ScholarTang
 * @Date 2021/7/13 10:53
 * @Desc 调度器
 */
public class HelloSchedulerDemo 
    public static void main(String[] args) throws SchedulerException 
        //从调度工厂中获取调度器实例
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        //通过JobBuilder构建一个任务实例
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                //设置任务的唯一实例名称和任务组名称组名
                .withIdentity("job1", "group1")
                //构建实例
                .build();
        //通过TriggerBuilder构建触发器实例
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                //设置触发器唯一实例名称和触发器的组名
                .withIdentity("trigger1", "group1")
                //执行计划,每五秒执行一次
                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5))
                //立即执行
                .startNow()
                //构建实例
                .build();
        //调度器绑定任务实例和触发器
        scheduler.scheduleJob(jobDetail,trigger);
        //开启定时任务
        scheduler.start();
    

7.4.执行结果

以上是关于Quartz入门的主要内容,如果未能解决你的问题,请参考以下文章

quartz的入门级使用

Quartz入门

Spring Boot 应用系列 6 -- Spring Boot 2 整合Quartz

Spring Boot 入门:集成Quartz定时任务

Quartz之入门实例

Quartz入门以及相关表达式使用