发布时间:2025-12-10 19:35:09 浏览次数:2
quartz3插件_隐藏的宝藏奖励[通俗易懂]尽管在官方文档中进行了简要描述,但我相信Quartz插件了解得还不够多,看看它们有多有用。本质上,Quartz中的插件是方便的类,用于包装基础侦听器的注册。您可以自由编写自己的插件,但我们将专注于Quartz随附的现有插件。LoggingTriggerHistoryPlugin首先介绍一些背景。Quartz中的两个主要抽象是作业和触发器。Job是我们要计划的一段代码。…_quartzschedulerplugin
尽管在官方文档中进行了简要描述,但我相信 Quartz插件了解得还不够多,看看它们有多有用。本质上,Quartz中的插件是方便的类,用于包装基础侦听器的注册。 您可以自由编写自己的插件,但我们将专注于Quartz随附的现有插件。
LoggingTriggerHistoryPlugin
首先介绍一些背景。 Quartz中的两个主要抽象是作业和触发器。 Job是我们要计划的一段代码。 触发器指示调度程序何时应运行此代码。 CRON(例如,每个星期五在9 AM到5 PM之间运行直到11月)和简单的(每2小时运行100次)触发器是最常用的。 您可以将任意数量的触发器关联到一个作业。
信不信由你,Quartz默认不提供任何日志记录或监视任何已执行的作业和触发器。 有一个API,但是没有实现内置的日志记录。 它不会向您显示由于触发触发器而现在可以执行此特定作业。 因此,您应该做的第一件事是将以下几行添加到quartz.properties中:
org.quartz.plugin.triggerHistory.class=org.quartz.plugins.history.LoggingTriggerHistoryPluginorg.quartz.plugin.triggerHistory.triggerFiredMessage=Trigger [{1}.{0}] fired job [{6}.{5}] scheduled at: {2, date, dd-MM-yyyy HH:mm:ss.SSS}, next scheduled at: {3, date, dd-MM-yyyy HH:mm:ss.SSS}org.quartz.plugin.triggerHistory.triggerCompleteMessage=Trigger [{1}.{0}] completed firing job [{6}.{5}] with resulting trigger instruction code: {9}. Next scheduled at: {3, date, dd-MM-yyyy HH:mm:ss.SSS}org.quartz.plugin.triggerHistory.triggerMisfiredMessage=Trigger [{1}.{0}] misfired job [{6}.{5}]. Should have fired at: {3, date, dd-MM-yyyy HH:mm:ss.SSS}希望我今天分享的这篇文章可以帮到您。
第一行(也是唯一需要的行)将加载插件类LoggingTriggerHistoryPlugin。 其余各行将配置插件,自定义日志消息。 我发现内置默认值不是很周全,例如,它们显示当前时间,这已经是日志框架消息的一部分。 您可以自由构造任何日志消息,有关详细信息,请参阅API。 添加这些额外的几行使调试和监视更加容易:
LoggingTriggerHistoryPlugin | Trigger [Demo.Every-few-seconds] fired job [Demo.Print-message] scheduled at: 04-04-2012 23:23:47.036, next scheduled at: 04-04-2012 23:23:51.036//...job outputLoggingTriggerHistoryPlugin | Trigger [Demo.Every-few-seconds] completed firing job [Demo.Print-message] with resulting trigger instruction code: DO NOTHING. Next scheduled at: 04-04-2012 23:23:51.036现在您知道为什么命名触发器(Demo.Every-few-seconds)和作业(Demo.Print-message)如此重要。
LoggingJobHistoryPlugin
还有另一个与日志记录相关的便捷插件:
org.quartz.plugin.jobHistory.class=org.quartz.plugins.history.LoggingJobHistoryPluginorg.quartz.plugin.jobHistory.jobToBeFiredMessage=Job [{1}.{0}] to be fired by trigger [{4}.{3}], re-fire: {7}org.quartz.plugin.jobHistory.jobSuccessMessage=Job [{1}.{0}] execution complete and reports: {8}org.quartz.plugin.jobHistory.jobFailedMessage=Job [{1}.{0}] execution failed with exception: {8}org.quartz.plugin.jobHistory.jobWasVetoedMessage=Job [{1}.{0}] was vetoed. It was to be fired by trigger [{4}.{3}] at: {2, date, dd-MM-yyyy HH:mm:ss.SSS}规则是相同的–插件+额外配置。 有关详细信息和可能的占位符,请参见LoggingJobHistoryPlugin的JavaDoc 。 快速查看日志可以发现非常具有描述性的输出:
Trigger [Demo.Every-few-seconds] fired job [Demo.Print-message] scheduled at: 04-04-2012 23:34:53.739, next scheduled at: 04-04-2012 23:34:57.739Job [Demo.Print-message] to be fired by trigger [Demo.Every-few-seconds], re-fire: 0//...job outputJob [Demo.Print-message] execution complete and reports: nullTrigger [Demo.Every-few-seconds] completed firing job [Demo.Print-message] with resulting trigger instruction code: DO NOTHING. Next scheduled at: 04-04-2012 23:34:57.739我不知道为什么默认情况下不启用这些插件。 毕竟,如果您不需要这样的详细输出,则可以在日志记录框架中将其关闭。 没关系,我认为在对Quartz执行进行故障排除时将它们安装到位是个好主意。
XMLSchedulingDataProcessorPlugin
这是一个非常全面的插件。 它读取包含作业的XML文件(默认名称为quartz_data.xml)并触发定义,并将其添加到调度程序中。 当您有一次需要添加一次的全局作业时,此功能特别有用。 插件可以更新现有的作业/触发器,也可以忽略XML文件(如果它们已经存在)–在使用JDBCJobStore时非常有用。
org.quartz.plugin.xmlScheduling.class=org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin在上述文章中,我们一直在手动将作业添加到调度程序中:
val trigger = newTrigger(). withIdentity("Every-few-seconds", "Demo"). withSchedule( simpleSchedule(). withIntervalInSeconds(4). repeatForever() ). build() val job = newJob(classOf[PrintMessageJob]). withIdentity("Print-message", "Demo"). usingJobData("msg", "Hello, world!"). build() scheduler.scheduleJob(job, trigger)使用XML配置可以实现相同的效果,只需将以下quartz_data.xml放在CLASSPATH中:
<?xml version="1.0" encoding="UTF-8"?><job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_2_0.xsd "> <processing-directives> <overwrite-existing-data>false</overwrite-existing-data> <ignore-duplicates>true</ignore-duplicates> </processing-directives> <schedule> <trigger> <simple> <name>Every-few-seconds</name> <group>Demo</group> <job-name>Print-message</job-name> <job-group>Demo</job-group> <repeat-count>-1</repeat-count> <repeat-interval>4000</repeat-interval> </simple> </trigger> <job> <name>Print-message</name> <group>Demo</group> <job-class>com.blogspot.nurkiewicz.quartz.demo.PrintMessageJob</job-class> <job-data-map> <entry> <key>msg</key> <value>Hello, World!</value> </entry> </job-data-map> </job> </schedule></job-scheduling-data>使用XML配置可以实现相同的效果,只需将以下quartz_data.xml放在CLASSPATH中:
org.quartz.plugin.xmlScheduling.fileNames=/etc/quartz/system-jobs.xml,/home/johnny/my-jobs.xmlorg.quartz.plugin.xmlScheduling.scanInterval=60关机钩子插件
最后但并非最不重要的是ShutdownHookPlugin。 小型但可能有用的插件,可以在JVM中注册关闭钩子,以便轻轻地停止调度程序。 但是,我建议关闭cleanShutdown –如果系统已经试图突然停止应用程序(通常是Spring通过SchedulerFactoryBean通过SchedulerFactoryBean调用调度程序关闭)或用户按下Ctrl + C –等待当前正在运行的作业似乎是个坏主意。 毕竟,也许由于某些作业运行时间过长/过长而导致我们正在终止应用程序?
org.quartz.plugin.shutdownHook.class=org.quartz.plugins.management.ShutdownHookPluginorg.quartz.plugin.shutdownHook.cleanShutdown=false如您所见,Qurtz附带了一些非常有趣的插件。 由于某些原因,它们在官方文档中没有详细描述,但是它们工作得很好,并且是调度程序的重要补充。
带有已应用插件的源代码可在GitHub上获得。
参考: Quartz Scheduler插件– Java和社区博客上来自JCG合作伙伴 Tomasz Nurkiewicz的隐藏宝藏 。
翻译自: https://www.javacodegeeks.com/2012/04/quartz-scheduler-plugins-hidden.html