Quartz 详细介绍

Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵 活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构 建,JavaMail及其它,支持cron-like表达式等等。

Quartz框架是一个全功能、开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统。Quartz可以执行上千上万的任务调度。

Quartz 核心概念

Job(任务)、JobDetail(任务细节)、Trigger(触发器)、Scheduler(任务调度器)

Job:其实Job是接口,查看源码就知道只有一个execute方法:package org.quartz;

public interface Job {

void execute(JobExecutionContext var1) throws JobExecutionException;

}

我们开发者只要实现此接口,实现execute方法即可。把我们想做的事情,在execute中执行即可。

JobDetail:Quartz执行Job时,需要新建个Job实例,但是不能直接操作Job类,所以通过JobDetail来获取Job的名称、描述信息。重要属性如下:name:任务的名称。

group:任务所在的组(默认值:DEFAULT)。

jobClass:任务的实现类。

jobDataMap:传参的作用。

Trigger:执行任务的规则;比如每天,每小时等。

一般情况使用 SimpleTrigger 和 CronTrigger,这个触发器实现了 Trigger 接口。CronTrigger:对于复杂的时间表达式使用,比如每个月15日上午几点几分

SimpleTrigger:对于简单的时间表达式使用,比如每天执行几次

Scheduler:是最核心的概念,需要把JobDetail和Trigger注册到scheduler中,才可以执行。

下载jar包,本文内容使用的是最新的2.3版本

org.quartz-scheduler

quartz

2.2.1

org.quartz-scheduler

quartz-jobs

2.2.1

简单的示例public class QuartzTest {

public static void main(String[] args) {

try {

// 获取 Scheduler 调度器实例

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// 启动调度

scheduler.start();

// 关闭调度

scheduler.shutdown();

} catch (SchedulerException se) {

se.printStackTrace();

}

}

}

一旦您使用StdSchedulerFactory.getDefaultScheduler()获取调度程序,您的应用程序将不会终止,直到您调用scheduler.shutdown(),因为将有活动线程。

注意

不同的版本的jar包,具体的操作不太相同,但是思路是相同的;比如1.8.6jar包中,JobDetail是个类,直接通过构造方法与Job类关联。SimpleTrigger和CornTrigger是类;在2.0.2jar包中,JobDetail是个接口,SimpleTrigger和CornTrigger是接口

JavaSE 简单的搭建

项目结构图

log4j.xml,日志输出<?xml  version="1.0" encoding="UTF-8"?>

log4j:configuration SYSTEM "log4j.dtd">

HelloJob.java,具体执行的任务import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

/**

* 具体执行的任务

*/

public class HelloJob implements Job {

Logger logger = LoggerFactory.getLogger(this.getClass());

@Override

public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

System.out.println("Hello Job");

// 此任务仅打印日志便于调试、观察

this.logger.debug(this.getClass().getName() + " trigger...");

}

}

Main方法测试import org.quartz.*;

import org.quartz.impl.StdSchedulerFactory;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.util.concurrent.TimeUnit;

/**

* 测试入口

*/

public class Bootstrap {

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

public static void main(String[] args) {

try {

// 获取 Scheduler 调度器实例

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// 启动调度

scheduler.start();

// 具体任务 JobDetail

JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();

// 触发时间点(每5秒执行一次)

SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever();

// 触发器

Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(simpleScheduleBuilder).build();

// 交由Scheduler安排触发

scheduler.scheduleJob(job, trigger);

/* 为观察程序运行,此设置主程序睡眠1分钟才继续往下运行(因下一个步骤是“关闭Scheduler”) */

try {

TimeUnit.MINUTES.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

// 关闭调度

scheduler.shutdown();

} catch (SchedulerException se) {

logger.error(se.getMessage(), se);

}

}

}

除了上面的SimpleTrigger,最常见的还有Cron表达式的用法,至于什么含义,在第三章中会有讲到CronTrigger trigger = newTrigger().withIdentity("trigger1", "group1").withSchedule(cronSchedule("0/20 * * * * ?")).build();

Date ft = sched.scheduleJob(job, trigger);

log.info(job.getKey() + " 计划运行时间:" + ft + "cron表达式:" + trigger.getCronExpression());

执行调度的结果输出日志INFO] 09 九月 04:32:17.318 下午 main [org.quartz.impl.StdSchedulerFactory]

Using default implementation for ThreadExecutor

[INFO] 09 九月 04:32:17.322 下午 main [org.quartz.simpl.SimpleThreadPool]

Job execution threads will use class loader of thread: main

[INFO] 09 九月 04:32:17.336 下午 main [org.quartz.core.SchedulerSignalerImpl]

Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl

[INFO] 09 九月 04:32:17.336 下午 main [org.quartz.core.QuartzScheduler]

Quartz Scheduler v.2.2.3 created.

[INFO] 09 九月 04:32:17.337 下午 main [org.quartz.simpl.RAMJobStore]

RAMJobStore initialized.

[INFO] 09 九月 04:32:17.338 下午 main [org.quartz.core.QuartzScheduler]

Scheduler meta-data: Quartz Scheduler (v2.2.3) '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.

[INFO] 09 九月 04:32:17.338 下午 main [org.quartz.impl.StdSchedulerFactory]

Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'

[INFO] 09 九月 04:32:17.338 下午 main [org.quartz.impl.StdSchedulerFactory]

Quartz scheduler version: 2.2.3

[INFO] 09 九月 04:32:17.338 下午 main [org.quartz.core.QuartzScheduler]

Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.

Hello Job

[DEBUG] 09 九月 04:32:17.350 下午 DefaultQuartzScheduler_Worker-1 [com.anson.example1.HelloJob]

com.anson.example1.HelloJob trigger...

Hello Job

[DEBUG] 09 九月 04:32:22.344 下午 DefaultQuartzScheduler_Worker-2 [com.anson.example1.HelloJob]

com.anson.example1.HelloJob trigger...

Hello Job

[DEBUG] 09 九月 04:32:27.344 下午 DefaultQuartzScheduler_Worker-3 [com.anson.example1.HelloJob]

com.anson.example1.HelloJob trigger...

...

... 省略一下重复调度的hello Job内容日志 ...

...

[INFO] 09 九月 05:00:38.327 下午 main [org.quartz.core.QuartzScheduler]

Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.

[INFO] 09 九月 05:00:38.327 下午 main [org.quartz.core.QuartzScheduler]

Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.

[INFO] 09 九月 05:00:38.328 下午 main [org.quartz.core.QuartzScheduler]

Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.

Hello Job

[DEBUG] 09 九月 05:00:38.328 下午 DefaultQuartzScheduler_Worker-3 [com.anson.example1.HelloJob]

com.anson.example1.HelloJob trigger...

通过观察上面的日志可以看出一些默认的配置信息,比如何时开启调度,何时关闭调度,调度器的默认实例名DefaultQuartzScheduler ,默认的SimpleThreadPool执行的线程数位10个等等。

打开 quartz-2.2.3.jar 文件中的默认 quartz.properties 文件,对应的默认配置信息如下。# Default Properties file for use by StdSchedulerFactory

# to create a Quartz Scheduler Instance, if a different

# properties file is not explicitly specified.

#

org.quartz.scheduler.instanceName: DefaultQuartzScheduler

org.quartz.scheduler.rmi.export: false

org.quartz.scheduler.rmi.proxy: false

org.quartz.scheduler.wrapJobExecutionInUserTransaction: false

org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool

org.quartz.threadPool.threadCount: 10

org.quartz.threadPool.threadPriority: 5

org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

org.quartz.jobStore.misfireThreshold: 60000

org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

如果在测试或生产环境中进行动态配置上吗的默认信息,可以在src目录下新建一个 quartz.properties 文件,配置内容来覆盖默认配置。org.quartz.scheduler.instanceName = MyScheduler

org.quartz.threadPool.threadCount = 3

然后,在运行demo示例,会发现日志中的输出就会有所变化。

调度器的实例名变成了MyScheduler,线程的数量变成了3个,这意味着,同时最多可以运行3个Jobs[INFO] 09 九月 04:56:54.685 下午 main [org.quartz.impl.StdSchedulerFactory]

Using default implementation for ThreadExecutor

[INFO] 09 九月 04:56:54.704 下午 main [org.quartz.core.SchedulerSignalerImpl]

Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl

[INFO] 09 九月 04:56:54.704 下午 main [org.quartz.core.QuartzScheduler]

Quartz Scheduler v.2.2.3 created.

[INFO] 09 九月 04:56:54.705 下午 main [org.quartz.simpl.RAMJobStore]

RAMJobStore initialized.

[INFO] 09 九月 04:56:54.706 下午 main [org.quartz.core.QuartzScheduler]

Scheduler meta-data: Quartz Scheduler (v2.2.3) 'MyScheduler' 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 3 threads.

Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

[INFO] 09 九月 04:56:54.706 下午 main [org.quartz.impl.StdSchedulerFactory]

Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'

[INFO] 09 九月 04:56:54.706 下午 main [org.quartz.impl.StdSchedulerFactory]

Quartz scheduler version: 2.2.3

[INFO] 09 九月 04:56:54.707 下午 main [org.quartz.core.QuartzScheduler]

Scheduler MyScheduler_$_NON_CLUSTERED started.

Hello Job

[DEBUG] 09 九月 04:56:54.721 下午 MyScheduler_Worker-1 [com.anson.example1.HelloJob]

com.anson.example1.HelloJob trigger...

...

... 省略一下重复调度的hello Job内容日志 ...

...

[DEBUG] 09 九月 04:57:49.717 下午 MyScheduler_Worker-3 [com.anson.example1.HelloJob]

com.anson.example1.HelloJob trigger...

Hello Job

[DEBUG] 09 九月 04:57:54.719 下午 MyScheduler_Worker-1 [com.anson.example1.HelloJob]

com.anson.example1.HelloJob trigger...

[INFO] 09 九月 04:57:54.721 下午 main [org.quartz.core.QuartzScheduler]

Scheduler MyScheduler_$_NON_CLUSTERED shutting down.

[INFO] 09 九月 04:57:54.721 下午 main [org.quartz.core.QuartzScheduler]

Scheduler MyScheduler_$_NON_CLUSTERED paused.

[INFO] 09 九月 04:57:54.721 下午 main [org.quartz.core.QuartzScheduler]

Scheduler MyScheduler_$_NON_CLUSTERED shutdown complete.

如果你的英文够好的话,非常建议有必要阅读官方文档提供的示例代码跟着一起操作

http://www.quartz-scheduler.org/documentation/quartz-2.2.x/examples/标题描述"Hello World" for Quartz 入门

Example 2 - Simple Triggers显示了十几种使用简单触发器调度作业的不同方式

显示如何使用Cron Triggers来安排您的工作

演示参数如何传递到job以及job如何维持状态

Example 7 - Interrupting Jobs显示调度程序如何中断您的工作以及如何编写您的工作来处理中断

Example 8 - Fun with Calendars演示了一个假期日历如何可以用来排除在假期的作业的执行

Example 9 - Job Listeners使用job监听器让一个job触发另一个job,构建一个简单的工作流程

Example 10 - Using Quartz Plug-Ins演示使用XML作业初始化插件以及历史记录插件

Example 11 - Quartz Under High LoadQuartz可以运行大量的job,但是看看线程池如何可以限制同时执行多少个job

Example 12 - Remote Job Scheduling using RMI使用远程方法调用,Quartz调度程序可以由客户端远程调度

Example 13 - Clustered Quartz演示如何在集群环境中使用Quartz,以及Quartz如何使用数据库来保留计划信息

演示如何使用Trigger优先级来管理具有相同火灾时间的触发器的触发顺序

Example 15 - TC Clustered Quartz演示Quartz如何与Terracotta集群,而不是数据库

java se 定时任务_Quartz 定时任务使用 —— 入门简单调用(一)相关推荐

  1. java监控定时任务_Quartz 定时任务使用 —— Web项目监听中调用(二)

    在Web应用中使用Quartz Quartz也常用在Web应用中,常见的是交由Spring托管的形式,但这里并非介绍这个.这里介绍Quartz在Web应用中单独使用. 一般来说,Web应用启动时,应注 ...

  2. Java SE 6之GUI:让界面更加绚丽(上)

    Java是一种非常强大的编程语言,但Java的GUI能力一直是它的软肋.虽然Java提供2种图形解决方案,AWT和Swing.但这2种图形库的功能十分有限,使用它们并不能带来更多的用户体验.而且AWT ...

  3. java se 定时任务_Java实现定时任务的三种方法

    一.Quartz的特点 按作业类的继承方式来分,主要有以下两种: 作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式作业类不继承o ...

  4. java定时任务_定时任务最简单的3种实现方法(超好用)

    定时任务在实际的开发中特别常见,比如电商平台 30 分钟后自动取消未支付的订单,以及凌晨的数据汇总和备份等,都需要借助定时任务来实现,那么我们本文就来看一下定时任务最简单的几种实现方式. TOP 1: ...

  5. java 客户端定时任务_定时任务最简单的3种实现方法(超实用)

    定时任务在实际的开发中特别常见,比如电商平台 30 分钟后自动取消未支付的订单,以及凌晨的数据汇总和备份等,都需要借助定时任务来实现,那么我们本文就来看一下定时任务最简单的几种实现方式. TOP 1: ...

  6. 定时任务_定时任务Quartz入门

    前言 Quartz是一个定时任务框架,即可以在程序运行期间,定时定期的做出些什么事情,比如发邮件,重启机器,清除缓存等等. java.util.Timer也可以做到这些功能,但是Quartz框架毕竟是 ...

  7. Java SE 8: 从入门到上瘾

    目录 1.前言 2.怎么学? 3.IDE 4.官方资料 文字教程 API文档 1.前言 最近决定转行做开发,于是开始学java.(之前一直狂学数学,想在量化投资界吃点肉,后来觉得还是老实一点比较好) ...

  8. java timertask 定时_Java定时任务--Timer和TimerTask

    1.程序和编程 我们知道,计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具. 简单来说程序在本质上是指令的集合,而编程从字面上来讲就是编写这些指令集合(程序) ...

  9. php定时刷新token,PHP 定时任务获取微信access_token的简单示例

    搜索热词 感兴趣PHP 定时任务获取微信access_token的简单示例的小伙伴,下面一起跟随编程之家 jb51.cc的小编来看看吧. 最近开发微信公众平台,公众号调用各接口时都需使用access_ ...

最新文章

  1. softmax layer 简单理解以及实际例子【有白话讲解】
  2. 使用git提交到github,每次都要输入用户名和密码的解决方法
  3. 指定字符串按指定长度进行剪切
  4. 2011年计算机等级考试二级java笔试练习题(10)_2010年3月计算机等级考试二级Java笔试题及答案...
  5. 玩转产品排期:让小伙伴们高效协作
  6. 极度舒适的 Python 入门教程,佩奇也能学会~
  7. leetcode 438. Find All Anagrams in a String | 438. 找到字符串中所有字母异位词(Java)
  8. 安装Orchard错误
  9. JSON与XML的选择
  10. atitit。自定义uml MOF EMF体系eclipse emf 教程o7t
  11. mac matlab 模糊,MATLAB 2014a 在Mac OS X yosemite 10.10 Retina显示模糊的解决办法
  12. 计算机原理电梯控制系统设计,基于PLC的电梯控制系统的设计与研究
  13. 米家扫地机器人是石头代工_石头扫地机器人T4全面评测 支持软件虚拟墙,清扫更高效...
  14. seaborn关联图表之折线图和散点图
  15. Sicily1059-Exocenter of a Trian
  16. Panoramic Imaging及其应用于场景理解的综述
  17. 计算机英语性考任务答案,国开电大理工英语1单元自测2形考任务答案
  18. 算法:URL短地址压缩算法-短网址映射。
  19. 概率神经网络 PNN
  20. 以下内容选自雷军的博客

热门文章

  1. Python的6个必须知道的优点
  2. MAN PVCREATE
  3. js前端获取扫码枪扫描的数据,打印条形码,批量打印
  4. [年终总结]过去,现在,未来
  5. 小技巧大用处:微信小程序状态栏设置全攻略
  6. CDN 缓存机制阐述
  7. 三服务 | 浙江省委信息化管理中心领导参观走访世平信息
  8. SQL Server工具--bcp介绍与使用
  9. MATLAB GUI设计如何弹出新界面?
  10. 13篇基于Anchor free的目标检测方法