七. 在 quartz_jobs.xml 文件中实现监听器
本章的所有例子告诉了你如何以编程的方式设置监听器。假如我们一个关于在 quartz_jobs.xml 文件中以声明式配置监听器的例子都不提供本章就不能算是完结。
自 Quartz 1.5 开始,你能够在 Job 定义文件中指定监听器,当然就是知名的 quartz_jobs.xml 文件了。代码 7.14 显示了一个使用全局监听器的例子。
代码 7.14. Quartz 监听器能在 quartz_jobs.xml 文件中实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?xml version='1.0' encoding='utf-8'?> <quartz> <job-listener class-name="org.cavaness.quartzbook.chapter7.SimpleJobListener" name="SimpleJobListener"> </job-listener> <job> <job-detail> <name>PrintInfoJob</name> <group>DEFAULT</group> <job-listener-ref>SimpleJobListener</job-listener-ref> <job-class> org.cavaness.quartzbook.common.PrintInfoJob </job-class> </job-detail> <trigger> <simple> <name>printJobTrigger</name> <group>DEFAULT</group> <job-name> PrintInfoJob</job-name> <job-group>DEFAULT</job-group> <start-time>2005-09-13 6:10:00 PM</start-time> <! repeat indefinitely every 10 seconds > <repeat-count>-1</repeat-count> <repeat-interval>10000</repeat-interval> </simple> </trigger> </job> </quartz> |
在代码 7.14 中你看到那个附加的 <job-listener> 元素,它有两个必须的属性:
<job-listener
class-name="org.cavaness.quartzbook.chapter7.SimpleJobListener"
name="SimpleJobListener">
class-name 属性标识了监听器类的全限名称。name 属性指派给这个监听器一个逻辑名,在 <job-detail> 元素中用到。
下一步就是为在同一个文件中的每一个要用到监听器的 <job-detail> 元素中定义一个 <job-listener-ref> 元素。该元素的值必须与文件中所定义的其中一个 <job-listener> 元素的 name 属性相匹配。
做完那之后,要确保你已经在 quartz.properties 文件中通过设置属性让 Scheduler 使用了 JobInitializationPlugin。Quartz 插件会在下一章中详细讨论。目前,只要加入以下行到你的 quartz.properties 文件中:
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.validating=false
然后命名你的 XML 文件为 quartz_jobs.xml 并放到你的 classpath 下。
一些需注意的易出错的地方 很有必要提醒你在尝试 XML 文件中设置监听器时很可能会遇到的两个问题。在 Quartz 1.5 中,至少,监听器的的 setName() 方法未包含中接口中。getName() 方法是有的,但不存在相应的 setName()。这在以编程式使用监听器时似乎不会导致什么问题,但是对于声明式时就有问题了。你需要简单的为你的监听器创建一个 setName() 方法。另一个提示就是要确保你的监听器有一个无参构造方法。在某些情况下,Quartz 框架不会在乎,但当以声明式使用它时,你将会得到一个错误。最好还是声明一个无参的构造方法,这样总是安全的。 |
[译者 Unmi 后记] 配置文件中写成 <start-time>2005-09-13 6:10:00 PM</start-time>,让 Quartz 来解析这个时间字符串可能会出现异常,这在我的一个回复(http://www.blogjava.net/Unmi/archive/2007/11/17/159830.html#210032) 中有论及,现摘录如下:
quart_jobx.xml 中时间格式的问题,写成 2008-06-20 7:23:00 PM 的话 JobSchedulingDataProcessor.parseDate(value) 没办法解析
在 quarts_jobs.xml 中 <start-time> 的格式是:
<start-time>2008-06-23T21:23:00</start-time>
T隔开日期和时间,默认时区
或者:
<start-time>2008-06-23T21:23:00+08:00</start-time>
+08:00 表示东八区
我觉得这是 Quartz 的一个 Bug,其实 Quartz 在解析时间时准备了两个 Pattern 的,分别是:
yyyy-MM-dd'T'hh:mm:ss
yyyy-MM-dd hh:mm:ss a
但是在 JobSchedulingDataProcessor.parseDate(value) 方法中只会以第一个 Pattern 解析时间,并不会尝试使用第二个 Pattern 去解析时间,第二个 Pattern 是可以认识 2008-06-20 7:23:00 PM 的。
所以为了规避这个问题,还是应该写成 yyyy-MM-dd'T'hh:mm:ss 格式。
本文链接 https://yanbin.blog/quartz-job-scheduling-framework-7-6/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。