Quartz使用(1) - 初识quartz

1. 背景

由于最新的工作项目中,需要使用quartz框架,以完成相关的任务的定时执行。经过两周的调研与使用,本系列博客会参考官网及网上相关博客,结合工作项目中的使用,详细介绍quartz的各个方面。如果有相关的错误,烦请不吝赐教。如果有相关的疑惑,可以评论,本人会抽空解答。

2. quartz是什么?

Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.

基于官网解释,可以看出quartz是开源且具有丰富特性的"任务调度库",能够集成于任何的java应用,小到独立的应用,大至电子商业系统。quartz能够创建亦简单亦复杂的调度,以执行上十、上百,甚至上万的任务。任务job被定义为标准的java组件,能够执行任何你想要实现的功能。quartz调度框架包含许多企业级的特性,如JTA事务、集群的支持。

简而言之,quartz就是基于java实现的任务调度框架,用于执行你想要执行的任何任务。其次,quartz也支持.Net平台。

3. quartz的下载

quartz目前的最新版本为quartz-2.2.3,下载有两种方式,完整包或Maven依赖。

(1) 完整包的下载

完整包的下载地址:quartz-2.2.3-distribution.tar.gz,完整包中包含例子、源码、依赖以及说明文档等

(2) Maven依赖的导入

官网目前提供的Maven依赖为2.2.1,mvnrepository目前已支持2.3.0,版本之间的更新特性本人尚未研究。quartz的依赖至少有sl4j-api相关的jar包。

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

quartz的Maven依赖

4. quartz的主要模块

quart主要有三个核心模块:Scheduler、Job、Trigger

(1) Job

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

(2) Trigger

Trigger为你执行任务的触发器,比如你想每天定时3点发送一份统计邮件,Trigger将会设置3点进行执行该任务。Trigger主要包含两种SimpleTrigger和CronTrigger两种。关于二者的区别的使用场景,后续文章会进行讨论。

(3) Scheduler

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

5. quartz的简单使用

例:现在想要实现一个每10秒打印一次"Hello World"的任务。

(1) 定义任务Job

package org.ws.quartz.test1;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorldJob implements Job{

    private static Logger logger = LoggerFactory.getLogger(HelloWorldJob.class);

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        logger.info("Hello World");
    }
}

HelloWorldJob

(2) 调度主方法

package org.ws.quartz.test1;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SimpleQuartzExample {

    private static Logger logger = LoggerFactory.getLogger(SimpleQuartzExample.class);

    public static void main(String[] args) throws SchedulerException, InterruptedException {

        SimpleQuartzExample exam = new SimpleQuartzExample();

        logger.info("init scheduler componets");

        // 创建任务
        JobDetail jobDetail = exam.createJobDetail();

        // 创建触发器
        Trigger trigger = exam.createTrigger();

        // 创建调度器
        Scheduler scheduler = exam.createScheduler();

        // 构建调度任务
        scheduler.scheduleJob(jobDetail, trigger);

        logger.info("execute scheduler");
        // 开启调度器
        scheduler.start();

        // 一分钟后关闭调度器
        Thread.sleep(60000);
        scheduler.shutdown();

        logger.info("shut down scheduler");
    }

    protected Scheduler createScheduler() throws SchedulerException{
        return StdSchedulerFactory.getDefaultScheduler();
    }

    protected JobDetail createJobDetail(){
        return JobBuilder.newJob(HelloWorldJob.class) // 待执行的任务
                .withIdentity("HelloWorld_Job", "HelloWorld_Group") // 名称与组名组成Scheduler中任务的唯一标识
                .build(); // 构建
    }

    protected Trigger createTrigger(){
        return  TriggerBuilder.newTrigger()
                .withIdentity("HelloWorld_Trigger", "HelloWorld_Group") // 名称与组名组成Scheduler中触发器的唯一标识
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule() // 创建SimpleTrigger
                        .withIntervalInSeconds(10) // 10秒间隔
                        .repeatForever() // 重复循环
                        ).build(); // 构建
    }
}

SimpleQuartzExample

(3) 运行结果

  2017-07-09 12:51:10 [INFO]-[org.ws.quartz.test1.SimpleQuartzExample] init scheduler componets
  2017-07-09 12:51:11 [INFO]-[org.ws.quartz.test1.SimpleQuartzExample] execute scheduler
  2017-07-09 12:51:11 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World
  2017-07-09 12:51:21 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World
  2017-07-09 12:51:31 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World
  2017-07-09 12:51:41 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World
  2017-07-09 12:51:51 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World
  2017-07-09 12:52:01 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World
  2017-07-09 12:52:11 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World
  2017-07-09 12:52:11 [INFO]-[org.ws.quartz.test1.SimpleQuartzExample] shut down scheduler
  

console_log

  (4) 分析

该例简单说明了quartz的基本使用方式,构建调度器使用标准工厂中的默认调度器StdSchedulerFactory.getDefaultScheduler(),Job由JobBuilder进行构建,使用简单触发器SimpleTrigger,调度器的开启直接使用scheduler.start()开启即可,关闭时,调度器shutdown()方法。

时间: 2024-08-10 21:32:53

Quartz使用(1) - 初识quartz的相关文章

初识Quartz(一)

首先需要一个任务: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package quartz_project; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Lo

初识Quartz(三)

本文将介绍CronTrigger的使用方法,CronTrigger相比 SimpleTrigger可以支持更复杂的作业计划.cron这一观念来自UNIX,在UNIX中,cron是一个运行于后台的守护程序,它负责所有基 于时间的时间.Unix cron守护进程每个一分钟被唤醒一次去检查叫做crontabs的配置文件,以此来决定是否有要执行的任务.个人觉得Quartz就是借鉴了它的名字和 相似的语法表达式,如果你之前接触过cron,那么理解本文将会很轻松. Quartz Trigger Cron E

初识Quartz(二)

简单作业: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package quartz_project.example2; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import o

quartz配置参数org.quartz.jobStore.misfireThreshold含义解释

配置定时任务参数 quartz.properties文件时 需要配置jobStore的超过时间数 默认为60秒(这里单位为毫秒) org.quartz.jobStore.misfireThreshold = 60000 这个参数一般在多线程池条件下无效. 产生misfire失败的条件: 单线程执行定时任务 第一个任务的执行完后的结束时间 减去 第二个任务的开始时间 = 时间间隔 时间间隔 大于 60s时, 第二个任务不会被执行. 这个叫做失败临界值,或者临界时间 例如 设置quartz.prop

初识Quartz(入门案例)+常用的Cron表达式

1.Quartz架构图 1.实体层 package cn.happy.entity; //1. public class Plan { //时间 private String date; //任务 private String task; public Plan(String date, String task) { this.date = date; this.task = task; } public Plan() { } @Override public String toString()

Quartz 2D:初识

在UIView中重写drawRect方法 - (void)drawRect:(CGRect)rect { [self drawLine]; } #pragma mark 画线操作 - (void)drawLine{ //1.获取上下文-UIView对应的上下文 CGContextRef context = UIGraphicsGetCurrentContext(); //2.创建可变路径并设置路径 CGMutablePathRef path = CGPathCreateMutable(); //

Quartz使用(2) - Quartz核心接口Scheduler、Job

quartz的核心接口如下: 接口 含义 Scheduler scheduler的主要API接口 Job 任务实现接口,期望调度器能够执行 JobDetail 用于定义Job实例 Trigger 调度器基于特定时间来执行指定任务的组件 JobBuilder 用于定义.创建JobDetail实例 TriggerBuilder 用于定义.创建Trigger实例 1. Scheduler 一个调度器的生命周期为通过SchedulerFactory创建,直到执行其shutdown()方法.当Schedu

Quartz初识以及简单运用

1.初识Quartz 1.1.概述 Quartz是一个完全由Java编写的一个开源的任务调度框架,说的简单点就是开发人员可以通过Quartz根据时间间隔调度任务,例如: 每隔一小时命令程序执行一个任务 每个月命令程序执行一个任务 指定某月末日命令程序执行一个任务 -- Quartz下载地址:http://www.quartz-scheduler.org/downloads/ 1.2.Quartz API 1.2.1.Scheduler--与scheduler交互的主要API; Scheduler

Quartz实现定时任务(一)

前言 有段时间没写blog了,说来惭愧,最近一直在给公司做P2P项目的服务端,但这都不是借口,高尔基曾说过(不太确定T_T),时间就像海绵里的水,只要愿意挤总是有的!所以写博客的节奏还是必须脉动回来,必须养成不断学习,不断记录,不断总结的好习惯.废话不多说,最近需要做一些服务器端的定时任务,决定使用Quartz去实现,之前也没接触过,所以就边学边做了,顺便把这个过程记录下来. 初识Quartz 首先看一下百科中对Quartz的简介:Quartz是OpenSymphony开源组织在Job sche