簡體   English   中英

在春季計划任務

[英]Scheduling Tasks in Spring

我們有一個要求,我們必須在X可能為30-60的數據庫中收集X分鍾的文檔。 將這些文檔收集到數據庫中之后,我們必須通過REST調用將它們推送到單獨的服務。

由於這些文檔不會很大,因此我們將它們匯總在一起,然后將它們一起推送。

現在,必須在固定的時間間隔后推送這些文檔,因此我想到了創建一個單獨的線程,該線程從數據庫中提取記錄,將其推送到服務,並且一旦服務響應為200 OK,我就從數據庫中刪除這些記錄,線程進入睡眠狀態X分鍾。

class PushDocumentsToService extends Thread{
    DocumentRepository documentRepository;
    DocumentProcessingService documentProcessingService
    public void run(){
        List<Document> list = documentRepository.getAllDocuments();
        Integer statusCode = documentProcessingService.sendDocuments(list);
        if(statusCode == 200)
            documentRepository.remove(list);
        try{
            Thread.sleep(30*60);
        }catch(..){..}
    }    

}

現在,我的一些同事已建議我不要在代碼中使用Thread.sleep。 我無法理解...的不良影響

Thread.sleep()

Spring Scheduler和Google Guava等庫和框架還可以使用哪些方法來進行計划任務?

您需要做的就是使用ScheduledExecutorService安排線程並提供適當的頻率速率。

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);    

Thread t1= new PushDocumentsToService();    
scheduledThreadPool.scheduleAtFixedRate(t1, 0, 30,TimeUnit.SECONDS);

如果您的類路徑中有Spring Scheduling庫,則將@Scheduled批注添加到希望在一段時間內執行的方法。 無需擴展Thread或實現Runnable Spring會代您處理所有這些工作。

您知道,只要應用程序正在運行

@Scheduled(cron = "30 * * * * *")
public void loadDataIntoRepository() {
    // your code
}

出於以下原因, 建議使用Thread.sleep

  • 現在 ,在休眠期間,執行代碼的線程將阻塞 30分鍾是您的線程被阻塞的長時間。
  • 您的線程可能會中斷,無法為您提供從錯誤狀態中恢復的真正方法。
  • 出於可維護性的考慮,當功能已經存在並且已經過充分測試時,您不必通過計划重新設計輪子。

暫無
暫無

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

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