Quartz Job Scheduling Framework[翻译]第八章. 使用 Quartz 插件 (第四部分)

四. 使用多个插件

你喜欢多少个,就可以在 quartz.properties 文件中注册多少个插件。然而,加载和初始化的顺序却不能保证,因为 Quartz 加载先把所有的属性到一个 Map 中,然后按照从 Map 中取出的顺序遍历插件。

为规避这一限制,你可以创建一个 Quartz 插件作为父插件,然后以给定的顺序加载其他多个插件。代码 8.6 显示了 ParentPlugin 长什么样子。

代码 8.6. ParentPlugin 能以特定的顺序加载子插件 阅读全文 >>

Quartz Job Scheduling Framework[翻译]第八章. 使用 Quartz 插件 (第三部分)

三. 注册你的插件

SchedulerFactory 首次初始化的时候,会从 quartz.properties 文件中搜寻你所配置的 Quartz 插件。它会通过 java.lang.ClassnewInstance() 方法创建插件的实例。你的插件必须有一个无参的构造方法,像代码中 JobLoaderPlugin 所做的那样。

要在 quartz.properties 文件中注册你的插件的话,需在 quartz.properties 文件中使用如下的格式创建一个属性:

org.quartz.plugin.<pluginName>.class=<fully_qualified_class_name_of_plugin>

Quartz 找寻属性文件中所有含这个关键词的项:

org.quartz.plugin.<pluginName>.class 阅读全文 >>

Quartz Job Scheduling Framework[翻译]第八章. 使用 Quartz 插件 (第二部分)

二. 创建 Quartz 插件

创建一个新的插件很简单。你所有要做的就是创建一个 Java 类(或重用一个现有的类),让它实现 org.quartz.spi.SchedulerPlugin 接口。Scheduler 将会在启动期间创建这个插件的实例。这个插必须有一个无参的构造方法,很显然它不能是抽象的。

·JobInitializationPlugin

Quartz 框架有一个用来从 XML 文件中加载 Job 和 Trigger 信息的插件。这个插件就是 org.quartz.plugins.xml.JobInitializationPlugin,并且它在前面第三章 "Hello, Quartz" 中简略的讨论过。当你使用这个插件的时候,Quartz 框架就会搜寻一个叫做 quartz_jobs.xml 的文件并试图从中加载 Job 和 Trigger 信息。 阅读全文 >>

Quartz Job Scheduling Framework[翻译]第八章. 使用 Quartz 插件 (第一部分)

第八章. 使用 Quartz 插件

Quartz 框架提供了几种用于扩展平台能力的方式。通过使用各种 "钩子" (通常指的就是扩展点),Quartz 变得很容易被扩展和定制化来适应你的需要。其中一个最简单的扩展框架的方法就是使用 Quartz 插件。本章就来看看如何使用插件机制让 Quartz 进入到之前 Quartz 用户没去过的领域。

一. 什么是插件?

假如你使用过其他的开源框架,例如 Apache Struts,你应该已经熟悉了插件的概念和它们的用法。非常简单,一个 Quartz 插件就是一个实现了 org.quartz.spi.SchedulerPlugin 接口的 Java 类,并且被作为插件注册给了 Scheduler。这个插件接口包含了三个方法,显示在代码 8.1 中。 阅读全文 >>

Oracle 驱动版本引起的显示字段奇怪编码问题

开门见山把产生问题的原因的解决办法列出来。

我们一般获取 Statement 都是通过 conn.createStatement() 方法,很少传递参数给它的,所以其内置属性都取默认值的,取记录只用 while(rs.next()) 逐个取即可。然而有一个需求(Oracle 8i 之前的版本不支持子查询排序,所以无法用 rownum 取分页记录) 是通过如下代码来得到 Statement:

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

由它获得的结果集可以 rs.absolute(n) 直接跳到第 n 行记录来获得值,但就这个用法出问题了,取出来的中文出现乱码了,如 "无效",变成了 "0xE697A0E69588" 阅读全文 >>

Quartz Job Scheduling Framework[翻译]第七章. 实现 Quartz 监听器 (第七部分)

八. 监听器中的线程使用

你看到了监听器接口中的方法后,你或许想知道是线程在调用监听器方法中饰演着什么样的角色。基实监听器方法是存在一个时序的,正如你看到方法名能想像到的那样。在一个 Job 执行的生命周期中,调用监听器方法以的顺序通常是固定的。图 7.2 描绘了监听方法的调用顺序和所涉及到的工作者线程。

图 7.2. 监听器方法按某一特定的时序被调用调用监听器方法的时序是固定的。如图 7.2 所示,在 Job 的执行前后,调用 Job 的 execute() 方法相同的线程被用于调用 JobListenerTriggerListener 的方法。假如你使用任何类类型的第三方线程管理工具或者打算实现你自己的线程池管理,知道这一点是很重要的。假如你在监听方法中实现了一个长运行逻辑时,这也会带来对性能上的负面影响。因为调用监听方法的线程和执行 Job 是同一个工作者线程,你不应该把监听方法实现的太复杂并要花费较长时间才能完成。保持它们的执行时间尽可能短。

阅读全文 >>

Quartz Job Scheduling Framework[翻译]第七章. 实现 Quartz 监听器 (第六部分)

七. 在 quartz_jobs.xml 文件中实现监听器

本章的所有例子告诉了你如何以编程的方式设置监听器。假如我们一个关于在 quartz_jobs.xml 文件中以声明式配置监听器的例子都不提供本章就不能算是完结。

自 Quartz 1.5 开始,你能够在 Job 定义文件中指定监听器,当然就是知名的 quartz_jobs.xml 文件了。代码 7.14 显示了一个使用全局监听器的例子。

代码 7.14. Quartz 监听器能在 quartz_jobs.xml 文件中实现 阅读全文 >>

Quartz Job Scheduling Framework[翻译]第七章. 实现 Quartz 监听器 (第五部分)

六. 使用 FileScanListener

Quartz 框架还包含一个我们未曾提及的监听器。这个监听器不像别的,因为它是为特定目的而设计的:同框架所带的一个工具 Job 一起用的。

这个监听器就是 org.quartz.jobs.FileScanListener 接口,它显式的设计为 FileScanJob 所用的,这一 Job 也在 org.quartz.jobs 包中。FileScanJob 检查某一指定文件的 lastModifiedDate。当某人改变了这个文件,这个 Job 就调用 FileScanListenerfileUpdated() 方法。

就像使用其他类型的 Quartz 监听器一样,你必须创建一个实现了 FileScanListener 接口的具体类。只有一个方法需要实现: 阅读全文 >>

Quartz Job Scheduling Framework[翻译]第七章. 实现 Quartz 监听器 (第四部分)

五. 监听 Scheduler 事件

org.quartz.SchedulerListener 接口包含了一系列的回调方法,它们会在 Scheduler 的生命周期中有关键事件发生时被调用。代码 7.9 列出了包括在 SchedulerListener 接口的方法。

代码 7.9. org.quartz.SchedulerListener 接口中的方法

阅读全文 >>

Tomcat 使用 Log4j 输出详细系统日志信息,快速诊断启动故障

Tomcat 启动时的系统日志默认是由 JdkLog14Logger 打印出来的,如

2008-7-7 11:19:34 org.apache.catalina.core.StandardEngine start
信息: Starting Servlet Engine: Apache Tomcat/5.0.28
2008-7-7 11:19:34 org.apache.catalina.core.StandardHost start
信息: XML validation disabled
2008-7-7 11:19:34 org.apache.catalina.core.StandardHost getDeployer
信息: Create Host deployer for direct deployment ( non-jmx )

那我们能不能用 Log4J 来输出这种系统日志呢?我们知道像 Apache 那样的大部分开源框架、组件都是用通用日志组件 (commons-logging) 来输出日志的,因此如果把 commons-logging 和 log4j 搭配使用就能输出十分详尽的日志信息。 阅读全文 >>