2015-04-27 17 views
2

我們有一個Web應用程序(基於Spring),用戶可以在其中提交一些後臺線程中運行的任務。我們使用TaskExecutor來提交runnables,並且只要執行程序線程空閒,它們就會被處理。提交要在夜間執行的任務

現在我們想不是直接運行這些工作,但開始處理它們,在晚上的某個小時依次進行。在那之前,他們都會排隊等候。我們不知道一天會有多少工作,也不知道他們需要多少時間,所以我們不想在固定的時間單獨安排。

我看了一下Spring的Quartz集成,但到目前爲止我還沒有發現任何有用的東西。如果這些待處理的作業以某種方式持續存在,以便它們能夠在重新啓動後繼續存在,那將會很好

任何想法?提前致謝。

回答

1

您可以採取的一種方法是將每個任務存儲在數據庫中,只要它被提交即可。

然後,在晚上,您可以運行一個查詢數據庫並按順序處理返回的任務的作業。當每個任務的處理完成後,您可以從數據庫中刪除任務或將其標記爲已處理。

如果碰巧有很多任務,可以分批處理。

該作業的草圖可以是:

@Scheduled(cron = "some_time_at_night") 
public void runJob() { 
    // Query non processed tasks from the database 
    List<Task> tasks = database.getNonProcessedTasks(); 
    // Iterated over returned tasks 
    for (Task t : tasks) { 
     try { 
      // Process current task 
      this.process(t); 
      // Mark current task as processed in database or delete it 
      database.updateTaskAsProcessed(t); 
     } catch (Exception ex) { 
      // Handle ex, either log it or store it for further reference 
     } 
    } 
} 

private void process(Task t) { 
    // Perform processing here 
} 

春天由@Scheduled annotation的手段支持cron表達式。

+1

感謝您的幫助。我希望有更多的「自動化」解決方案,只需對現有代碼進行最小限度的更改,但我想我會嘗試一下。 – user683887

0

你可以使用cron表達式:

@Scheduled(cron = "* 2 * * *") 
public void doSomething() { 
} 

這一點,例如將在每天凌晨2點運行。

CronTrigger類也可能對您有用,在官方的Spring文檔中有一小段關於它的問題。

1

讓這些任務倖存重啓的唯一方法是將它們和它們的數據保存在某種數據庫中。

對於時間表問題,我會在特定的服務上使用@Scheduled註釋,它會調用數據庫或執行程序的任務隊列中的任務,然後處理它們。

+0

謝謝您的回答。我知道將任務序列化到磁盤/ bd是唯一的選擇,但我希望有一些方法可以通過保留TaskExecutor接口的Quartz自動完成。 – user683887

0

您可以在這打個電話的TaskExecutor作爲

實例的方法添加@Scheduled註釋:

@Scheduled (cron="0 0 2 * * ? *", fixedDelay = 5000) 
public void updateEmployeeInventory(){ 
    System.out.println("Started fixed delay job"); 
    /** 
    * add your scheduled job logic here 
    */ 
} 

FIXEDDELAY:櫃面,如果你指定固定的延時爲5秒,然後註釋的方法會每5秒調用一次固定的延遲,這意味着該週期將從每次前面的調用的完成時間開始測量。

這個更多細節會發現下面的鏈接: -

  1. Schedule jobs using @Scheduled annotation in spring
  2. CronTrigger Tutorial