Quartz Scheduler插件–隐藏的宝藏
本質(zhì)上,Quartz中的插件是方便的類,用于包裝基礎(chǔ)偵聽(tīng)器的注冊(cè)。 您可以自由編寫(xiě)自己的插件,但我們將專注于Quartz隨附的現(xiàn)有插件。
LoggingTriggerHistoryPlugin
首先介紹一些背景。 Quartz中的兩個(gè)主要抽象是作業(yè)和觸發(fā)器。 Job是我們要計(jì)劃的一段代碼。 觸發(fā)器指示調(diào)度程序何時(shí)應(yīng)運(yùn)行此代碼。 CRON(例如,每個(gè)星期五在9 AM到5 PM之間運(yùn)行直到11月)和簡(jiǎn)單的(每2小時(shí)運(yùn)行100次)觸發(fā)器是最常用的。 您可以將任意數(shù)量的觸發(fā)器關(guān)聯(lián)到一個(gè)作業(yè)。
信不信由你,Quartz默認(rèn)不提供任何日志記錄或監(jiān)視任何已執(zhí)行的作業(yè)和觸發(fā)器。 有一個(gè)API,但是沒(méi)有實(shí)現(xiàn)內(nèi)置的日志記錄。 它不會(huì)向您顯示由于觸發(fā)觸發(fā)器而現(xiàn)在可以執(zhí)行此特定作業(yè)。 因此,您應(yīng)該做的第一件事是將以下幾行添加到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。 其余各行將配置插件,自定義日志消息。 我發(fā)現(xiàn)內(nèi)置默認(rèn)值不是很周全,例如,它們顯示當(dāng)前時(shí)間,這已經(jīng)是日志框架消息的一部分。 您可以自由構(gòu)造任何日志消息,有關(guān)詳細(xì)信息,請(qǐng)參閱API。 添加這些額外的幾行使調(diào)試和監(jiān)視更加容易:
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現(xiàn)在您知道為什么命名觸發(fā)器(Demo.Every-few-seconds)和作業(yè)(Demo.Print-message)如此重要。
LoggingJobHistoryPlugin
還有另一個(gè)與日志記錄相關(guān)的便捷插件:
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}規(guī)則是相同的–插件+額外配置。 有關(guān)詳細(xì)信息和可能的占位符,請(qǐng)參見(jiàn)LoggingJobHistoryPlugin的JavaDoc 。 快速查看日志可以發(fā)現(xiàn)非常具有描述性的輸出:
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我不知道為什么默認(rèn)情況下不啟用這些插件。 畢竟,如果您不需要這樣的詳細(xì)輸出,則可以在日志記錄框架中將其關(guān)閉。 沒(méi)關(guān)系,我認(rèn)為在對(duì)Quartz執(zhí)行進(jìn)行故障排除時(shí)將它們安裝到位是個(gè)好主意。
XMLSchedulingDataProcessorPlugin
這是一個(gè)非常全面的插件。 它讀取包含作業(yè)的XML文件(默認(rèn)名稱為quartz_data.xml)并觸發(fā)定義,并將其添加到調(diào)度程序中。 當(dāng)您有一次需要添加一次的全局作業(yè)時(shí),此功能特別有用。 插件可以更新現(xiàn)有的作業(yè)/觸發(fā)器,也可以忽略XML文件(如果它們已經(jīng)存在)–在使用JDBCJobStore時(shí)非常有用。
org.quartz.plugin.xmlScheduling.class=org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin在上述文章中,我們一直在手動(dòng)將作業(yè)添加到調(diào)度程序中:
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配置可以實(shí)現(xiàn)相同的效果,只需將以下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配置可以實(shí)現(xiàn)相同的效果,只需將以下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關(guān)機(jī)鉤子插件
最后但并非最不重要的是ShutdownHookPlugin。 小型但可能有用的插件,可以在JVM中注冊(cè)關(guān)閉鉤子,以便輕輕地停止調(diào)度程序。 但是,我建議關(guān)閉cleanShutdown –如果系統(tǒng)已經(jīng)試圖突然停止應(yīng)用程序(通常是Spring通過(guò)SchedulerFactoryBean通過(guò)SchedulerFactoryBean調(diào)用調(diào)度程序關(guān)閉)或用戶按下Ctrl + C –等待當(dāng)前正在運(yùn)行的作業(yè)似乎是個(gè)壞主意。 畢竟,也許由于某些作業(yè)運(yùn)行時(shí)間過(guò)長(zhǎng)/過(guò)長(zhǎng)而導(dǎo)致我們正在終止應(yīng)用程序?
org.quartz.plugin.shutdownHook.class=org.quartz.plugins.management.ShutdownHookPlugin org.quartz.plugin.shutdownHook.cleanShutdown=false如您所見(jiàn),Qurtz附帶了一些非常有趣的插件。 由于某些原因,它們?cè)诠俜轿臋n中沒(méi)有詳細(xì)描述,但是它們工作得很好,并且是調(diào)度程序的重要補(bǔ)充。
帶有已應(yīng)用插件的源代碼可在GitHub上獲得。
參考: Quartz Scheduler插件– Java和社區(qū)博客上來(lái)自JCG合作伙伴 Tomasz Nurkiewicz的隱藏寶藏 。
翻譯自: https://www.javacodegeeks.com/2012/04/quartz-scheduler-plugins-hidden.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Quartz Scheduler插件–隐藏的宝藏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 白银止盈止损怎么设置(止盈和止损怎么设置
- 下一篇: 三脚金蟾怎样摆放(三足金蟾招财摆放)