# 示例1 - 你的第一个Quartz程序

说明

Quartz的第1个示例程序,将此视为Quartz的“Hello World”。

# 简析

本示例旨在演示如何使用Quartz启动和运行。这个例子将启动一个简单的作业,运行输出“Hello World”。

该程序将执行以下操作:

  • 启动Quartz调度器

  • 安排作业在下一个偶数分钟运行

  • 等待90秒,让Quartz有机会运行作业

  • 关闭调度器程序

# 运行该示例

此示例可以从examples/example1目录中执行。有两种开箱即用的方法来运行此示例:

  • example1.sh——UNIX/Linux shell脚本

  • example1.bat——Windows批处理文件

# 代码

此示例的代码位于org.quartz.examples.example1包中。

本示例中的代码由以下类组成:

类名 描述
SimpleExample 主程序
HelloJob 一个输出“Hello World”的简单作业

# HelloJob

HelloJob是一个简单的作业,它实现了Job接口,并将一条通知消息记录到日志中(默认情况下,这只会显示在屏幕上)。当前日期和时间将打印在作业中,以便您可以准确查看作业的运行时间。

public void execute(JobExecutionContext context) throws JobExecutionException {
    //输出“Hello World!”以及展示日期/时间
    _log.info("Hello World! - " + new Date());
}

# SimpleExample

程序从获取调度器(Scheduler)的实例开始。这是通过创建标准调度器工厂(StdSchedulerFactory),然后使用它创建调度器来完成的。这将创建一个简单的基于RAM的调度器。

SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();

HelloJob使用作业详情(JobDetail)类定义为Quartz的作业:

//定义作业并将其关联到HelloJob类
JobDetail job = newJob(HelloJob.class)
    .withIdentity("job1", "group1")
    .build();

我们创建了一个简单调度器(SimpleTrigger),将在下一轮启动:

//计算下一分钟的时间
Date runTime = evenMinuteDate(new Date());

//触发该作业在下一分钟执行
Trigger trigger = newTrigger()
    .withIdentity("trigger1", "group1")
    .startAt(runTime)
    .build();

现在我们将作业与调度程序中的触发器相关联:

//用我们的触发器通知Quartz安排该作业
sched.scheduleJob(job, trigger);

此时,作业已被安排在触发器触发时运行。但是,调度程序尚未运行。所以,我们必须通知调度程序启动!

sched.start();

为了让程序有机会运行作业,我们会休眠90秒。调度程序在后台运行,应该在这90秒内启动作业。

Thread.sleep(90L * 1000L);

最后,我们将优雅地关闭调度器:

sched.shutdown(true);

注意:在关闭消息中传递true会告诉Quartz调度器等待所有作业完成运行后再从方法调用返回。

# HelloJob.java源码

package org.quartz.examples.example1;

import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * 这只是一个输出“Hello World!”的简单作业
 * 作者:Bill Kratzer
 */
public class HelloJob implements Job {

    private static Logger _log = LoggerFactory.getLogger(HelloJob.class);

    /**
     * 作业初始化的空参构造函数
     * Quartz需要一个公共的空参构造函数,以便调度器可以在需要时实例化类
     */
    public HelloJob() {
    }

    /**
     * 当与此作业相关联的触发器触发时,由调度器调用此方法
     * Throws:作业执行异常(JobExecutionException)-当执行作业时产生异常
     */
    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {

        //输出“Hello World!”以及展示日期/时间
        _log.info("Hello World! - " + new Date());
    }

}

# SimpleExample.java源码

package org.quartz.examples.example1;

import static org.quartz.DateBuilder.evenMinuteDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;

/**
 * 本示例将演示如何启动和关闭Quartz调度程序,以及如何安排作业在Quartz中运行
 * 作者:Bill Kratzer
 */
public class SimpleExample {

  public void run() throws Exception {
    Logger log = LoggerFactory.getLogger(SimpleExample.class);

    log.info("------- Initializing ----------------------");

    //首先,我们必须获得对调度器的引用
    SchedulerFactory sf = new StdSchedulerFactory();
    Scheduler sched = sf.getScheduler();

    log.info("------- Initialization Complete -----------");

    //计算下一分钟的时间
    Date runTime = evenMinuteDate(new Date());

    log.info("------- Scheduling Job  -------------------");

    //定义作业并将其关联到HelloJob类
    JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();

    //触发该作业在下一分钟执行
    Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();

    //用我们的触发器通知Quartz安排该作业
    sched.scheduleJob(job, trigger);
    log.info(job.getKey() + " will run at: " + runTime);

    //启动调度程序(在启动调度程序之前,任何东西都无法实际运行!)
    sched.start();

    log.info("------- Started Scheduler -----------------");

    //等待足够长的时间,以便调度器有机会执行该作业
    log.info("------- Waiting 65 seconds... -------------");
    try {
      //等待65秒以显示作业
      Thread.sleep(65L * 1000L);
      //正在执行...
    } catch (Exception e) {
      //
    }

    //关闭调度器
    log.info("------- Shutting Down ---------------------");
    sched.shutdown(true);
    log.info("------- Shutdown Complete -----------------");
  }

  public static void main(String[] args) throws Exception {

    SimpleExample example = new SimpleExample();
    example.run();

  }

}

# 控制台输出

[main] INFO org.quartz.examples.example1.SimpleExample - ------- Initializing ----------------------
[main] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
[main] INFO org.quartz.simpl.SimpleThreadPool - Job execution threads will use class loader of thread: main
[main] INFO org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
[main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.0 created.
[main] INFO org.quartz.simpl.RAMJobStore - RAMJobStore initialized.
[main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.0
[main] INFO org.quartz.examples.example1.SimpleExample - ------- Initialization Complete -----------
[main] INFO org.quartz.examples.example1.SimpleExample - ------- Scheduling Job  -------------------
[main] INFO org.quartz.examples.example1.SimpleExample - group1.job1 will run at: Tue Nov 29 13:00:00 CST 2022
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
[main] INFO org.quartz.examples.example1.SimpleExample - ------- Started Scheduler -----------------
[main] INFO org.quartz.examples.example1.SimpleExample - ------- Waiting 65 seconds... -------------
[DefaultQuartzScheduler_Worker-1] INFO org.quartz.examples.example1.HelloJob - Hello World! - Tue Nov 29 13:00:00 CST 2022
[main] INFO org.quartz.examples.example1.SimpleExample - ------- Shutting Down ---------------------
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
[main] INFO org.quartz.examples.example1.SimpleExample - ------- Shutdown Complete -----------------

Process finished with exit code 0

微信公众号

QQ交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。