簡體   English   中英

Spring批處理:傳播在分區步驟中遇到的異常(停止作業執行)

[英]Spring batch : Propagate exception encountered in partitioned step (Stop job execution)

背景

我目前有一個讀取平面文件的 spring-batch 作業。 該作業使用MultiResourcePartitioner讀取已拆分為 N 個較小文件的文件的物理分區。 這意味着文件的每個物理分區都會導致執行一個新的從屬步驟來讀取分區。

問題

如果讀取任何物理分區有任何問題,則該從屬步驟的執行將失敗,並且 spring 批處理將記錄異常。 這不會影響正在讀取文件的不同物理分區的其余從步驟的執行; 然而,這不是理想的行為。 我想要的是,如果讀取特定物理分區時出現問題(例如:無法解析特定列),則應將異常傳播到啟動Job的位置,以便我可以停止任何進一步的處理。

AbstractStep execute方法的當前實現捕獲Throwable並通過記錄異常來抑制異常。 因此,異常不會傳播到Job啟動的位置,並且無法停止其余從屬步驟的執行。

如何讓 spring-batch 將在從屬步驟中發生的任何異常一直傳播到Job啟動的位置? 我想這樣做,以便在處理任何分區文件時出現問題時可以停止任何進一步的處理。

如果讀取任何物理分區有任何問題,則該從屬步驟的執行將失敗,並且 spring 批處理將記錄異常。 這不會影響正在讀取文件的不同物理分區的其余從步驟的執行; 然而,這不是理想的行為。

我認為“這不會影響其余從屬步驟的執行”這一事實理想的行為。 通常情況下,后面的分割工作的一大塊成並行執行的更小的任務的想法是,任務應獨立於彼此和一個故障不會影響到其他人。 如果有一個邏輯要求一個任務失敗來停止其他任務,這意味着任務沒有很好地定義為獨立的,並且在本地/遠程分區步驟中執行它們首先不是合適的選擇。

我想要的是,如果讀取特定物理分區時出現問題(例如:無法解析特定列),則應將異常傳播到啟動作業的位置,以便我可以停止任何進一步的處理。

為此,您需要一個自定義PartitionHandler 這是協調工人步驟的部分。 默認行為是在向主作業報告之前等待所有工作人員步驟完成並匯總結果。 您的自定義實現應該檢測任何工作步驟的失敗並通知其他人停止。

此外,如果其中一個工作失敗,則停止/使所有工作人員失敗的這種設計不適合重新啟動作業。 這意味着重新啟動作業將重新啟動所有分區,這不是分區作業首先應重新啟動失敗分區的目標。

暫無
暫無

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

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