簡體   English   中英

在規定的時間間隔內運行Spring作業

[英]Running Spring job for a defined interval of time

我有一個包含表document的數據庫。 該表定義了我將要處理的文檔的路徑。
文檔的處理非常繁瑣,單個文檔可能要花費幾分鍾。
我有20萬多個文件要處理。
這些文檔托管在生產中的應用程序中。 所以我必須每晚處理它們。
我的問題是:是否可以定義一個spring-batch作業,該作業可以從DB查詢(未處理的)文檔並進行處理,然后安排該作業(使用Quartz)在上午8點停止並在晚上8pm重新啟動天?

編輯
我想我應該讓自己更清楚:
我的問題是:我是否應該有一份工作來處理所有文檔,並使其每天停止並在一天結束時重新啟動。 還是應該讓我的工作每次只處理一個文檔?

到現在為止,我只使用一項工作來遍歷所有文檔(自從我使用Spring Batch文檔以來),就發現了所有示例,他們都在談論(使用閱讀器)讀取整個表並處理數據。
如果這是個好方法,那么我該如何中斷工作執行,直到一天結束。
或者我應該只按文檔使用一項工作?

是的,這是可能的。

Cron表達式類似於:

0 0/1 20-8 ? * MON-FRI

只需確認一下即可(自從我看過cron表達式以來已經有一段時間了),但這應該在周一至周五的20:00至08:00之間的每一分鍾運行。

在默認情況下,Quartz作業不會在Spring中並發運行(請參閱: http : //static.springsource.org/spring/docs/3.0.x/reference/scheduling.html ),因此您不必擔心重疊。 然后,您可以在每次運行中選擇定義數量的文檔進行處理(10個說),如果前一個運行結束,直到凌晨8點,Quartz每分鍾都會觸發另一個運行。 當最后一個處理工作在早上完成時,它將直到下午5點才再次將其解雇。

請注意 ,上一份工作可能會在7:59:59開始並超過上午8點,因此您可能希望將結束時間提前一些以進行補償。

編輯:

我認為更細粒度的方法(不一定是單個文檔,而可能是一個塊)更適合於批處理和調度。 這有效地利用了石英來完成您將要在單個工作中執行的循環,但是卻為您帶來了不必擔心調度元素的所有好處!

您將需要一項工作來一次處理DB中的一個文檔。

在Spring Quartz中使用cron觸發器 ,您可以將其計划為定期運行(例如每30分鍾之后),從晚上8點運行到7:30 AM(如果一項作業大約需要30分鍾)。

您可以做下面的事情。

從數據庫處理文檔中讀取1(未處理)文檔路徑。 在數據庫提交中刪除(或標記為已處理)

要使作業按計划開始,可以使用Quartz計划程序。 但是,這不會在特定時間終止作業。 為此,您應該

  1. 確保您的作業可重新啟動並且以最小的工作單位進行工作。
  2. 創建一個自定義的Job包裝器,該包裝器在您的作業開始時啟動一個計時器,並每隔1分鍾輪詢一次,以確定是否必須關閉計時器,何時需要關閉計時器,調用執行上下文並取消作業。
  3. 因為該作業是可重新啟動的,所以它將能夠從下一次Quartz調度程序調用它的中斷點重新啟動。

暫無
暫無

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

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