天天看點

quartz常見問題

一、配置job的xml裡<start-time>的時間格式:

從源碼JobSchedulingDataProcessor類中可以看出:格式例如(2012-03-31T05:55:00)

    protected static final String XSD_DATE_FORMAT = "yyyy-MM-dd'T'hh:mm:ss";

二、quartz.properties配置filename:

應該是org.quartz.plugin.jobInitializer.fileNames = my_quartz_jobs.xml

而不是org.quartz.plugin.jobInitializer.fileName = my_quartz_jobs.xml

這個應該和quartz的jar包版本有關,具體哪個版本使用哪個麼有研究。

否則可能會報錯:

Exception in thread "main" org.quartz.SchedulerException: JobStore SchedulerPlugin 'org.quartz.plugins.xml.JobInitializationPlugin' props could not be configured. [See nested exception: java.lang.NoSuchMethodException: No setter for property 'fileName']

 at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1013)

 at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1399)

 at org.quartz.impl.StdSchedulerFactory.getDefaultScheduler(StdSchedulerFactory.java:1415)

 at com.gyb.JobScheduler.startScheduler(JobScheduler.java:28)

 at com.gyb.JobScheduler.main(JobScheduler.java:23)

Caused by: java.lang.NoSuchMethodException: No setter for property 'fileName'

 at org.quartz.impl.StdSchedulerFactory.setBeanProps(StdSchedulerFactory.java:1287)

 at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1011)

 ... 4 more

 附:網上整理的問題

問題1. 應用伺服器啟動狀态下,當對任務進行了修改時(即修改了job.xml中的任務明細),Quartz無法響應這種變化.也就是說,Quartz并沒有進行"有狀态"作業! 需求: 無論是修改了任務明細中的參數清單--JobDataMap,或是CronExpression中的定時表達式,都應該立即做出響應,并按照新的配置參數去執行這個任務. 解決:  在quartz.properties中加入下面兩行配置即可:

#自動掃描任務單并發現改動的時間間隔,機關為秒

org.quartz.plugin.jobInitializer.scanInterval = 10

#覆寫任務排程器中同名的jobDetail,避免隻修改了CronExpression所造成的不能重新生效情況

org.quartz.plugin.jobInitializer.overWriteExistingJobs = true   問題2: 測試任務單變更自檢的問題時,突然發現,當通過web頁面提供的任務配置接口進行報表訂閱任務的新增、修改等操作時,由于job.xml是在classes目錄下,是以tomcat會進行自動的reload(hot deploy).這看起來好象沒什麼問題,但在實際的應用環境下卻非常危險,因為web.xml中配置的随tomcat啟動而啟動的程式都會reload.可能這些程式很簡單,并不會産生什麼問題,但我們的軟體則不同,随tomcat的啟動,會有很多服務被啟動并進行着極為複雜的操作,是以classes目錄下的程式配置項都不會輕易修改.即使是修改,那也會重新啟動tomcat使服務正常運轉. 修改了任務單後發現某個服務出現了Illegal Access問題. 解決: Quartz的兩個主要配置檔案名稱可變,而且是從web.xml加載quartz.properties,又從quartz.properties找到job.xml,那麼job.xml沒必要放到classes目錄下。拿到web目錄下,就放到config/job.xml,然後修改quartz.properties檔案,将檔案指向修改成絕對路徑:

org.quartz.plugin.jobInitializer.fileName = D:/tomcat/webapps/report/config/job.xml job.xml無論如何變更,tomcat都不會reload,因為它已經不在classes目錄下了。   問題3: 在Debug過程中,發現Quartz的一個小問題,可能會對資源造成無謂的占用,那就是當一個任務從job.xml中被删除時,Quartz是不會響應這種減少任務的改變且此任務的程序仍然被占用,而且任務還會被執行。 解決: 可以考慮在JobDataMap中增加是否執行的配置項,即使任務會執行,但根據這種配置項,仍然可以拒絕下一步的操作.當然了,修改CronExpression使之成為一個永遠不會執行到的時間也是一個辦法.   問題4: 如何使Quartz加載多個job.xml 解決: 實作SchedulerPlugin接口并提供多任務檔案加載功能,将會是解決這個事情的好方法