在使用調度器Quartz來進行數據歸檔的時候,當我們開的定時任務很多的時候,就會出現一些定時任務不會被觸發的現象,這就是線程阻塞。那到底什么叫線程阻塞呢?
線程阻塞,顧名思義就是說線程被阻塞了,沒有按時執行,即定時任務沒有被觸發。那么為什么會出現中定時任務沒被觸發的現象呢?
通過對調取器的調度原理的分析,我們可以知道:當正在執行的調度任務個數超過了調度器中設置的最大值時,就會出線程阻塞,調度任務延遲執行的現象。
那么我們如何修改這個線程池中線程的最大個數,以滿足我們的調度需求呢?通過查看其jar包我們可以找到線程池的配置文件如下所示:
在下面這個包里:
我們可以找到配置文件如下:
我們需要copy一份這個屬性文件,並在這個文件的基礎上修改線程池的配置:
#===============================================================
#配置文件不是必須的,Quartz對配置項都是有默認值的,當需要自定義的時候,
#可以在classpath路徑下放一個quartz.properties文件,Quartz的StdSchedulerFactory
#在啟動時會自動加載該配置文件。
#===============================================================
#===============================================================
#配置主調度程序的屬性
#===============================================================
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
#當檢查某個Trigger應該觸發時,默認每次只Acquire一個Trigger,(為什么要有Acquire的過程呢?是為了防止多線程訪問的情況下,
#同一個Trigger被不同的線程多次觸發)。尤其是使用JDBC JobStore時,一次Acquire就是一個update語句,盡可能一次性的多獲取
#幾個Trigger,一起觸發,當定時器數量非常大的時候,這是個非常有效的優化。當定時器數量比較少時,觸發不是極為頻繁時,
#這個優化的意義就不大了。
org.quartz.scheduler.batchTriggerAcquisitionMaxCount=50
#===============================================================
#配置線程池的屬性
#===============================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
#線程池里的線程數,默認值是10,當執行任務會並發執行多個耗時任務時,要根據業務特點選擇線程池的大小。
org.quartz.threadPool.threadCount = 4
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#===============================================================
#配置JobStore的屬性
#===============================================================
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
注意:當我們在我們的項目中添加了quartz.properties的時候,我們需要把那些我們不需要修改的配置也加上,並不能只有我們修改的配置。因為通過查看源代碼我們可以知道,調度器在初始化的時候,首先判斷我們是否有quartz.properties,如果有的話,就是用我們系統中的配置文件,否則就從jar包里加載quartz.properties進行默認的初始化。