欢迎来到quartz快速入门教程。阅读本教程,你将会了解:

  • quartz下载
  • quartz安装
  • 根据你的需要,配置Quartz
  • 开始一个示例应用

  当熟悉了quratz调度的基本功能后,可以尝试一些更高级的特性,比如Where,这个一个企业级功能,可以让job和trigger运行在指定的,而不是随机的Terracotta客户端上。

下载和安装

  首先,下载最新的稳定版 - 不用注册。解压并安装。

Quartz jar文件

  quartz安装包根目录的lib/目录下有很多的jar包。其中,quartz-xxx.jar(其中xxx是版本号)是最主要的。为了使用quartz,必须将该jar包放在应用的classpath下;

  下载后,解压,然后将quartz-xxx.jar放到你的应用中。

  我主要是在应用服务器的环境中使用quartz,所以一般将quartz jar包放到应用中(.ear或.war)。当然,如果你希望在很多应用中使用quartz,将quartz的jar包放在应用服务器(appserver)的classpath下即可。如果你只是希望在独立的应用中使用quartz,将quartz的jar包和你的应用依赖的其它jar包放在一起即可。

  quzrtz依赖一些第三方的库(以jar包的形式),这些库位于quartz安装包的lib目录下。要使用quartz的所有功能,必须将所有的第三方jar包都放到classpath下。如果你开发的是一个独立的quartz应用,建议将所有的jar包都放到classpath下;如果是在应用服务器环境下使用quartz,其中有些包可能已经存在于classpath中了,因此你需要自己选择。

  在应用服务器环境下,如果同一个jar文件,存在两个不同的版本,要注意,可能会产生一些奇怪的结果;比如,WebLogic包含了一个J2EE的实现(在weblogic.jar中),该实现与servlet.jar的实现可能不一致。此时,应该从你的应用中排除掉servlet.jar,这样你就知道使用的是哪个类了。

properties文件

  quartz使用名为quartz.properties的配置文件。刚开始时该配置文件不是必须的,但是为了使用最基本的配置,该文件必须位于classpath下。

  基于我的个人情况举个例子,我的应用是基于WebLogic Workshop开发的。我将所有的配置文件(包括quartz.properties)放到应用根目录下的一个项目中。当我将项目打包成.ear文件时,放置配置文件的项目会以jar包的形式进入最终的.ear包,所以quartz.properties文件就自动位于classpath中了。

  如果你准备构建一个使用quartz的web应用(以.war包的形式),你应该将quartz.properties文件放到WEB-INF/classes目录下。

配置

  这里包含很多内容。quartz是一个配置很灵活的应用。配置quartz最好的方式是,编辑quartz.properties文件,然后放到应用的classpath下。

  quartz的安装包中包含了一些配置文件的示例,位于example/目录下。我建议你创建自己的quartz.properties文件,而不是简单地从示例中拷贝并删除不需要的部分。这样看起来更整洁,而且你也会了解到quartz的更多功能。

  关于quartz配置文件的详细文档,请查阅Quartz配置参考

  为了使用quartz,一个基本的quartz.properties配置文件如下所示:

org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

上述配置的scheduler有如下特点:

  • org.quartz.scheduler.instanceName - scheduler的名称为“MyScheduler”
  • org.quartz.threadPool.threadCount - 线程池中有3个线程,即最多可以同时执行3个job;
  • org.quartz.jobStore.class -

    quartz的所有数据,包括job和trigger的配置,都会存储在内存中(而不是数据库里)。如果你想使用quartz的数据库存储功能,我们建议在使用数据库存储之前,先使用内存存储(RamJobStore)。

示例应用

  下载和安装完quartz后,是时候开发一个示例应用,并让它跑起来了。下面的示例代码,获取scheduler实例对象,启动,然后关闭。

QuartzTest.java

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*; public class QuartzTest { public static void main(String[] args) { try {
// Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // and start it off
scheduler.start(); scheduler.shutdown(); } catch (SchedulerException se) {
se.printStackTrace();
}
}
}

  当你调用StdSchedulerFactory.getDefaultScheduler()获取scheduler实例对象后,在调用scheduler.shutdown()之前,scheduler不会终止,因为还有活跃的线程在执行。

  注意示例代码中的静态导入(static import),下面的代码中也会用到它们。

  如果你没有配置日志输出,所有的日志会输出到控制台,比如:

[INFO] 21 Jan 08:46:27.857 AM main [org.quartz.core.QuartzScheduler]
Quartz Scheduler v.2.0.0-SNAPSHOT created. [INFO] 21 Jan 08:46:27.859 AM main [org.quartz.simpl.RAMJobStore]
RAMJobStore initialized. [INFO] 21 Jan 08:46:27.865 AM main [org.quartz.core.QuartzScheduler]
Scheduler meta-data: Quartz Scheduler (v2.0.0) 'Scheduler' 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 50 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. [INFO] 21 Jan 08:46:27.865 AM main [org.quartz.impl.StdSchedulerFactory]
Quartz scheduler 'Scheduler' initialized from default resource file in Quartz package: 'quartz.properties' [INFO] 21 Jan 08:46:27.866 AM main [org.quartz.impl.StdSchedulerFactory]
Quartz scheduler version: 2.0.0 [INFO] 21 Jan 08:46:27.866 AM main [org.quartz.core.QuartzScheduler]
Scheduler Scheduler_$_NON_CLUSTERED started. [INFO] 21 Jan 08:46:27.866 AM main [org.quartz.core.QuartzScheduler]
Scheduler Scheduler_$_NON_CLUSTERED shutting down. [INFO] 21 Jan 08:46:27.866 AM main [org.quartz.core.QuartzScheduler]
Scheduler Scheduler_$_NON_CLUSTERED paused. [INFO] 21 Jan 08:46:27.867 AM main [org.quartz.core.QuartzScheduler]
Scheduler Scheduler_$_NON_CLUSTERED shutdown complete.

你可以在start()和shutdown()之间做一些有趣的事情:

// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class)
.withIdentity("job1", "group1")
.build(); // Trigger the job to run now, and then repeat every 40 seconds
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build(); // Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);

  在调用shutdown()之前,你需要给job的触发和执行预留一些时间,比如,你可以调用Thread.sleep(60000)让线程睡眠一段时间。

最新文章

  1. CodeBlocks及LCM应用
  2. Java面试宝典2015版
  3. Azure杂七杂八系列(二) - 如何在Azure上重新配置VM
  4. DP:斐波纳契数
  5. Java网络编程(客户端和服务端原理)
  6. Chrome浏览器插件VisualEvent,可以方便的查看页面绑定的事件
  7. codeforces 451E. Devu and Flowers 容斥原理+lucas
  8. ASP.NET5 Beta8
  9. mac osx 10.9安装配置macvim
  10. 关于scanf,gets
  11. iOS开发-FFmpeg深入分析
  12. left join on和where
  13. 【原创】大数据基础之CM5(Cloudera Manager)+CDH5离线安装
  14. 关于两栏布局,三栏布局,一级点击三角触发select的onchange事件问题
  15. 关于Unity单个对象多个脚本的Update调用的时序问题
  16. 干货 | PHP就该这么学!
  17. [luogu3246][bzoj4540][HNOI2016]序列【莫队+单调栈】
  18. 【PAT】B1067 试密码(20 分)
  19. 基于TensorFlow的简单验证码识别
  20. 关于在搜索栏的一些小bug

热门文章

  1. django for monkey(chapter one)
  2. js验证手机号输入是否符合规则
  3. UE4 自定义物理表面类型(Surface Type)
  4. JS小数点加减乘除运算后位数增加的解决方案
  5. DNS分别在什么情况下使用UDP和TCP
  6. NRF905 无线模块实验
  7. JDBC的增删改写成一个方法,调用一个工具类
  8. zjuoj 3608 Signal Detection
  9. 十、Java基础---------面向对象之抽象类与接口
  10. fgets函数