本質上,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 output
LoggingTriggerHistoryPlugin | 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.LoggingJobHistoryPlugin
org.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.739
Job [Demo.Print-message] to be fired by trigger [Demo.Every-few-seconds], re-fire: 0
//...job output
Job [Demo.Print-message] execution complete and reports: null
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: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.xml
org.quartz.plugin.xmlScheduling.scanInterval=60
關機鉤子插件
最后但并非最不重要的是ShutdownHookPlugin。 小型但可能有用的插件,可以在JVM中注冊關閉鉤子,以便輕輕地停止調度程序。 但是,我建議關閉cleanShutdown –如果系統已經試圖突然停止應用程序(通常是Spring通過SchedulerFactoryBean通過SchedulerFactoryBean調用調度程序關閉)或用戶按下Ctrl + C –等待當前正在運行的作業似乎是個壞主意。 畢竟,也許由于某些作業運行時間過長/過長而導致我們正在終止應用程序?
org.quartz.plugin.shutdownHook.class=org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownHook.cleanShutdown=false
如您所見,Qurtz附帶了一些非常有趣的插件。 由于某些原因,它們在官方文檔中沒有詳細描述,但是它們工作得很好,并且是調度程序的重要補充。
帶有已應用插件的源代碼可在GitHub上獲得。
參考: Quartz Scheduler插件– Java和社區博客上來自JCG合作伙伴 Tomasz Nurkiewicz的隱藏寶藏 。
翻譯自: https://www.javacodegeeks.com/2012/04/quartz-scheduler-plugins-hidden.html