第十二章. Quartz Cookbook
本章的目的是为在构建 Quartz 应用时常遇到的情形提供一系列的例子和解决方案。本章也可作为对本书剩余部分的一个参考和补充。
一. 与 Scheduler 一同工作
本节提供了使用 Quartz Scheduler 管理功能的几个例子。
·创建和启动 Scheduler
你能通过几种方式来启动 Quartz Scheduler,但是最简单的方式是使用两种 SchedulerFactory 实现中的一个。特别的,org.quartz.impl.stdSchedulerFactory 使用很简单,要执行对 Scheduler 的所有设置工作只需要调用 getDefaultScheduler() 这一静态方法即可,如代码 12.1 所演示的那般。
代码 12.1. 启动默认的 Scheduler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public void startScheduler() { Scheduler scheduler = null; try { // Get a Scheduler instance from the Factory scheduler = StdSchedulerFactory.getDefaultScheduler(); // Start the scheduler scheduler.start(); logger.info("Scheduler started at " + new Date()); // Schedule jobs and triggers } catch (SchedulerException ex) { // deal with any exceptions logger.error(ex); } } |
当你从这个工厂中取得了一个 Scheduler 的实例后,你就可以启动它,并往其中加入需要的 Job 和 Trigger。你既可在 Scheduler 启动之前,也可以在 Scheduler 启动之后加入 Job 和 Trigger。
Quartz 框架支持多个配置文件,这就允许你创建不同版本的 Scheduler。举个例子说,某个版本的配置文件设置了 Scheduler 作为单个实例使用 RAMJobStore,而同时,另一配置文件可配置 Cheduler 作为集群的一部分并使用某种 JDBCJobStore。
要指定一个配置文件而不用默认配置文件,你可用 StdSchedulerFactory 的 initialize() 方法并指定一个配置文件名作为参数。代码 12.2 描绘了这个例子。
代码 12.2. 使用一个不同 Quartz 配置文件来启动 Scheduler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public static void main(String[] args) { Scheduler scheduler = null; try { StdSchedulerFactory factory = new StdSchedulerFactory(); factory.initialize("myquartz.properties"); scheduler = factory.getScheduler(); scheduler.start(); logger.info("Scheduler started at " + new Date()); // Schedule jobs and triggers } catch (SchedulerException ex) { // deal with any exceptions logger.error(ex); } } |
装入 Job 到 Scheduler 中上面这些例子启动了 Scheduler 但是没有往其中加入任何 Job。你可以首先启动 Scheduler,接着加入你的 Job,或者你也可以选择先加入 Job 然后再启动 Scheduler。两种方式都能工作的很好。本章接下来的部分,我们会有一些采用了两种方式的例子。 |
·停止 Scheduler
Scheduler API 包含有两个版本的 shutdown() 方法。其中一个带有一个布尔型参数,另一个没有参数。这一布尔型参数告诉 Scheduler 是否等待正在执行的 Job 执行完成。
使用无参版的方法相当于是传递了 false 给另一个方法。假如你对停止当前正在执行的 Job 并不在意,那就调用这个:
scheduler.shudown();
否则,就用这个:
scheduler.shutdown(false);
另一方面,如果你希望在 Scheduler 停止之前完成正在执行的 Job,就传递 true 给 shudown() 方法:
scheduler.shutdown(true);
·暂停 Scheduler (Standby 模式)
要临时停止触发任何 Trigger,你可以调用 Scheduler 的 standby() 方法。Scheduler 和它的资源并不被销毁,并且 Scheduler 能在任何时候被重启。代码 12.3 展示了一个使用 standby() 方法的例子。
代码 12.3. 使 Scheduler 转入到 Standby 模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public void runScheduler() { Scheduler scheduler = null; try { // Get a Scheduler instance from the factory scheduler = StdSchedulerFactory.getDefaultScheduler(); // Start the scheduler scheduler.start(); // Pause the scheduler for some reason scheduler.standby(); // Restart the scheduler scheduler.start(); } catch (SchedulerException ex) { // deal with any exceptions logger.error(ex); } } |
当一个 Scheduler 被置为 standby 模式,已部署的 Trigger 将不被触发。而当 Scheduler 在使用了 start() 方法重新启动之后,所有的已被触发 Trigger 将依据 misfire 设置来决定处理。
本文链接 https://yanbin.blog/quartz-job-scheduling-framework-12-1/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
http://www.bt285.cn
BT285.cn 这样的BT网站老是job死掉,不知道是什么原因啊.
看看线程数配置的够不够多,默认为10个,少则有可以任务无限积压,进程未结束,但总是不执行任何 Job。
请不要发广告。