Quartz的糟糕設計

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團隊能夠重新設計一個不使用反射的接口,讓我們來保證線程的安全性。

以上內容僅爲個人拙見,歡迎提出其他見解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章