簡體   English   中英

Spring Scheduling:@Scheduled vs Quartz

[英]Spring Scheduling: @Scheduled vs Quartz

我正在閱讀關於調度的Spring 3.0文檔 我傾向於Spring的JobDetailBean for Quartz。 但是@Scheduled注釋引起了我的注意。 看來這是使用Spring Framework調度任務的另一種方式。 基於文檔,Spring提供了三種調度方式:

  1. @Scheduled
  2. 通過石英
  3. 通過JDK Timer

我對JDK Timer沒興趣。 我為什么要選擇@Scheduled而不是Quartz? (當我提到Quartz時,我的意思是使用Spring的bean包裝器進行Quartz)。

假設我的用例非常復雜,我將與第三方Web服務進行通信,以便按指定的時間間隔導入和導出數據。

Quartz比Spring的內置調度程序復雜一個數量級,包括對持久,事務和分布式作業的支持。 盡管如此,即使使用Spring的API支持,它也有點像豬。

如果您需要的是每隔X秒或在cron調度上對bean執行方法,那么@Scheduled (或Spring的<task> config schema中的各種選項)可能就足夠了

我必須說明我自己在使用@ScheduledQuartz作為Spring應用程序中的調度實現方面的經驗。

調度作業具有以下要求:

  • 最終用戶應該能夠保存和安排(定義執行時間)他們自己的任務
  • 服務器停機期間的計划作業不應從作業隊列中省略

因此,我們必須嘗試使用​​Quartz實現(版本2.2.3)以支持數據庫中作業的持久性。 一些基本結論如下:

  • 使用quartz.properties文件與Spring 4 MVC應用程序集成並不困難。
  • 我們能夠選擇第二個數據庫來存儲主數據庫中的作業。
  • 只要服務器啟動,服務器停機期間安排的作業就會開始運行。
  • 作為獎勵,我們設法使用自定義JobListenerTriggerListener在主數據庫中維護一些有用的(以及更多面向用戶的)有關用戶定義的預定作業的信息。
  • Quartz是一個非常有用的庫,適用於具有更復雜調度要求的應用程序。

根據Quartz文檔

我們可以使用@Scheduler中不存在的更復雜的功能。 例如:

  1. 在Quartz中,我們可以使用scheduler.standby();將調度程序置於待機模式scheduler.standby(); 並使用scheduler.start();重新安排它scheduler.start();
  2. 在執行作業之前或之后使用scheduler.shutdown(true);關閉調度scheduler.shutdown(true); scheduler.shutdown(false);
  3. 存儲作業供以后使用,當您需要該作業時,您可以觸發它。

JobDetail job1 =newJob(MyJobClass.class). withIdentity("job1","group1"). storeDurably(). build();

  1. 將新作業添加到調度程序,指示它使用給定的名稱和組(如果有)“替換”現有作業。

JobDetail job1 = newJob(MyJobClass.class). withIdentity("job1", "group1"). build();

在Spring中,您可以使用FixedRate,FixedDelay和cron來安排任務。 但是大多數預定作業需要動態處理執行時間。 所以在這種情況下最好使用Quartz,因為它提供了在DBJobstore和RAMJobstore中存儲預定作業的選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM