Quartz2.2.x官方文档2.2.X—第一章 快速开始

Quartz快速开始指导


Quartz快速开始指导

(主要作者是 Dafydd James)

欢迎来到关于Quartz的快速开始向导. 当你阅读这份指导时,希望你能理解这些:

  • 如何下载 Quartz
  • 如何安装 Quartz
  • 配置Quartz以适应你的特殊需求
  • 从一个简单应用开始

在熟悉了Quartz调度程序的基本特征之后,思考更多高级特征(Where),例如:允许任务和触发器允许在指定的Terracotta clients,而不是随机选择其中的一个服务这一企业特性。

下载和安装

首先, 下载更加稳定的版本(Download the most recent stable release)- 不需要注册,打开并安装它,你的应用程序即可使用它。

关于Quartz JAR文件

Quartz包包含几个jar文件,其位于发行版的根目录。核心Quartz类库名为quartz-xxx.jar (xxx是指当前版本号). 为了使用Quartz的各种特征,这个jar必须位于你应用程序的classpath.

一旦你下载了Quartz,并解压它, 你就可以获取quartz-xxx.jar并将它放到你你需要的地方 。 (如果你问怎么解压压缩包, 那么在你进行任何一个开发环境或线上环境应用之前,你应该先去认真学习.)

我使用Quartz主要在应用服务器环境,所以我偏向于让我的应用包含Quartz Jar(.ear 或者 .war 文件)。无论如何, 你想要使你的Quartz能够使用于更多的应用中,只需要确保它在你的webapp的classspath。如果你是开发一个独立应用,让它和你的依赖的其他jar一样都放在应用的classpath中。

Quartz依赖于一些第三方类库(以jars的形式),这些都放在发行版.zip文件的'lib'目录中。要使用Quartz的所有特性,所有第三方包必须存在于你的classpath中。如果你只是构建一个独立的Quartz应用,那么我建议你全部将他们添加到你classpath中。如果你在应用服务环境中使用Quartz,至少有一些jar已经包含在classpath,所以你可以(如果你愿意)更有选择性的包含这些jars。

在一个应用服务环境中,当意外的包含同一个jar的不同版本时,当心产生奇怪的结果。例如,WebLogic包含一个J2EE的实现(包含在weblogic.jar中),而servlet.jar中包含不同的另一个实现。因此,推荐你的应用环境应不在servlet.jar中,这样有利于你可以知道哪些类被使用。

属性文件

Quartz使用的属性文件叫做quartz.properties. 一开始时这不是必要的,但是在使用任何基础配置之前,你必须让它位于你的classpath中.

再一次根据我的个人情况给出一个例子,我的应用程序使用WebLogic WorkShop开发. 我保持让我项目中所有配置文件(包括quartz.properties)都在应用的根目录中。当我打包所有东西进一个.ear文件,配置项目被打包进.jar并包含在最终的.ear文件中。这样quartz.properties就自动位于classpath中。

如果你想要构建一个包含Quartz的web应用(以.war形式存在),为了让quartz.properties在classpath下,你需要将其放置在WEB-INF/classes中。

配置

这是一个大问题!Quartz是一个可以自由配置的应用。配置Quartz最好的方式是修改quartz.properties,并让它位于你应用的classpath下。(参考上面安装部分).

在Quartz发行版中有几个关于配置文件的例子,详情在examples/文件夹下. 我支持你创建属于你自己的quartz.properties文件,而不是复制例子删除其中你不需要的项. 这种方式更加整洁,并且你可以学习到Quartz提供的更多配置.

可用属性完整文档在这里 Quartz Configuration Reference.

需要快速启动和运行,一个基本的 quartz.properties文件看起来像这样=:

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

这个被配置文件创建的调度器有以下特征:

  • org.quartz.scheduler.instanceName - 这个调度器的名称将会使用“MyScheduler”.
  • org.quartz.threadPool.threadCount - 线程池有三个线程,含义是同时允许三个任务运行。
  • org.quartz.jobStore.class - 所有Quartz数据,例如jobs的详情和触发器,都会保存在内存中(而不是数据库)。及时你有数据库,并想使用它来运行Quartz,我仍然建议你在你使用数据库打开一个全新的维度之前,先使用RamJobStore让Quartz工作起来。

从一个应用应用开始

现在下载并安装Quartz,是时候拿一个简单的应用让它跑起来。下面的代码可以获得一个调度实例,运行、终止该调度:

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.shutdown()前你的应用不能终止,因为有活跃的线程。

注意代码例子中静态导入部分;在下面的例子中将会发挥作用。

如果你没有设置logging,所有日志将会发送到控制台,你的输出看起来像这样:

[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()之前,你需要些时间触发和执行任务-在当前这个简单例子里,你只需要添加并调用Thread.sleep(60000) 即可).

现在让我们做一些有意思的事情!

原文地址:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/quick-start.html

Demo Github地址:https://github.com/whp1473/quartz-demo/tree/master/sample

猜你喜欢

转载自blog.csdn.net/whp1473/article/details/82626120