第八章. 使用 Quartz 插件
Quartz 框架提供了几种用于扩展平台能力的方式。通过使用各种 "钩子" (通常指的就是扩展点),Quartz 变得很容易被扩展和定制化来适应你的需要。其中一个最简单的扩展框架的方法就是使用 Quartz 插件。本章就来看看如何使用插件机制让 Quartz 进入到之前 Quartz 用户没去过的领域。
一. 什么是插件?
假如你使用过其他的开源框架,例如 Apache Struts,你应该已经熟悉了插件的概念和它们的用法。非常简单,一个 Quartz 插件就是一个实现了 org.quartz.spi.SchedulerPlugin 接口的 Java 类,并且被作为插件注册给了 Scheduler。这个插件接口包含了三个方法,显示在代码 8.1 中。
代码 8.1. Quartz 插件必须实现的 SchedulerPlugin 接口
1 2 3 4 5 6 7 8 9 |
public interface SchedulerPlugin { public void initialize(String name, Scheduler scheduler) throws SchedulerException; public void start(); public void shutdown(); } |
SchedulerPlugin 的方法是在 Scheduler 的初始化和启动期间被调用。Scheduler 会调用每一个已注册插件的这三个方法。下面的几节描述了插件的每一个方法会在什么时候被调用。
·initialize() 方法
initialize() 方法在 Scheduler 的创建期间被调用。当 StdSchedulerFactory 的 getScheduler() 方法被调用后,这个工厂就调用所有注册的插件的 initialize() 方法。
插件不能同 DirectSchedulerFactory 正常工作 插件只是设计来用与 StdSchedulerFactory 的。这是在框架中的限制。如果你想要用插件,那么就需要使用 StdSchedulerFactory 来获取你的 Scheduler 实例。 |
每个插注册为一个唯一的名字。这个给定的名字和 Scheduler 实例被包含在对 initialize() 方法的调用中。你需要在你的插件初始化的时候做些事情。如,你的插件也许需要从文件或数据库中读取并解析数据。
Scheduler 在 initialize() 时并未完全创建好当这个方法在调用的时候,Scheduler 还未完全初始化好,因此它和 Scheduler 的交互应保持在尽量短的时间。例如,你不应该试图在 initialize() 方法中去部署任何 Job。 |
假如在初始化插件的时候发生了问题,你应当抛出一个 org.quartz.SchedulerConfigException 异常,这个异常是 SchedulerException 的子类。这能阻止插件的继续加载,并停止了它与 Scheduler 后面的交互。
·start() 方法
Scheduler 实例调用 start() 方法让插件知道它可以执行任何需要的启动动作了。例如,假如你有 Job 要部署,那这个时候就可以部署他们了。
·shutdown() 方法
shutdown() 方法被调用来通知插件 Scheduler 将要关闭了。这是给插件的一个机会去清理任何打开的资源。例如,数据库连接或是打开的文件应该要关闭。
Scheduler 实例不会传递给 start() 或 shutdown()注意到,Scheduler 实例并不会作为参数传递给 start() 或 shutdown() 方法。如果你的插件需要在 start() 或 shutdown() 中访问 Scheduler,你必须把 Scheduler 存放在插件的一个实例变量中。 |
本文链接 https://yanbin.blog/quartz-job-scheduling-framework-8-1/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。