Quartz的糟糕設計
不得不說Quartz定時任務系統提供給我們更方便,更好的處理定時任務的選擇,但是現在以Spring爲天下的應用環境來說Quartz的接口設計有點糟糕。
下面是Quartz的官方文檔實例代碼:
// define the job and tie it to our MyJob class
JobDetail job = newJob(MyJob.class)
.withIdentity("job1", "group1")
.build();
// Trigger the job to run now, and then repeat every 40 seconds
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);
大家注意一下newJob(MyJob.class)這一行,是不是突然覺得有點看不太懂,沒關係,只不過是Quartz使用反射時對外提供的接口而已。不過說到反射,那麼問題來了,反射生成的對象是不受Spring管理的,那麼如果我們在自己的MyJob.class中需要依賴Spring容器內的其他對象的話,是不是要手動初始化呢?是的。這不得不說是一個糟糕的設計,況且我們並不想使用反射,暫且不考慮反射得效率如何,一般情況下我們是希望我們的MyJob.class像一個Service類或者Dao類一樣,他線程安全,受spring管理,所以不必每次觸發定時任務都給我new一個新的出來。
迄今爲止我仍想不出爲什麼Quartz團隊會犯這麼低級的錯誤?但唯一一個可以說的過去得想法是他們想保證Quartz的線程安全,他們不認爲我們能保證MyJob.class的線程安全性。但這樣似乎也說不通,這樣的思想就和最初JDK的設計者將List集合設計成Vector有什麼區別。所以強烈建議Quartz團隊能夠重新設計一個不使用反射的接口,讓我們來保證線程的安全性。
以上內容僅爲個人拙見,歡迎提出其他見解。