javascript
Spring Batch可重启性
首先,我要非常感謝Spring的優(yōu)秀人員,他們花了無數(shù)時間來確保Spring Batch作業(yè)的可行性,以及發(fā)出重新啟動作業(yè)的神奇能力! 感謝您提供的這個優(yōu)雅的工具集,它使我們能夠瀏覽大量數(shù)據(jù)集,同時使我們在跌倒時能夠擺脫塵埃!
在承認我還有很多東西要學習的同時,我想分享一下有關(guān)可重新啟動性方面的經(jīng)驗教訓。 這篇文章將包括如何識別Spring Batch的Step&Job ExecutionContext的不正確使用,以及如何為Spring Batch編寫良好,有益的組件。
有狀態(tài)!
對于具有可變?nèi)肿兞康腷ean,有狀態(tài)性基本上是幻想。
例如,拿一張一美元的鈔票。 它的值是恒定的,因此將被視為無狀態(tài)。 另一方面,以Google等股票為例; 價格波動,其價值將被視為可變(或有狀態(tài))。
執(zhí)行上下文
為了保持狀態(tài),Spring使我們能夠同時訪問Step&Job的ExecutionContext ,以便我們可以處理需要跟蹤和正確完成工作的信息。
批處理代碼庫中有狀態(tài)的任何內(nèi)容都會威脅到其可重新啟動性的可行性。 有狀態(tài)的處理器,讀取器,寫入器或批處理操作使用的任何東西都應視為處于危險之中。
從技術(shù)上講,我想任何可序列化的對象都可以隨時放入ExecutionContext中,但是我認為這是一種危險的思考方式。 ExecutionContext更新應以非常事務性的方式進行處理。
什么信息
我建議僅在此處保留原始/偽原始簡單值。 如果您想在晚上輕松入睡,我還建議僅通過ItemProcessor或使用@BeforeStep或@AfterStep注釋的方法來編寫這些值。
什么不應該發(fā)生?
不應在核心業(yè)務邏輯中引入和傳遞ExecutionContext。 上下文值不應在步驟執(zhí)行過程中進行更新。 另外,您應該避免將可變的值持有者對象引入ExecutionContext,因為其引用很容易破壞事務邊界后面的值。
當我在代碼中看到這些類型的示例時,我認為它們對應用程序的可重新啟動性構(gòu)成威脅,并拒絕證明該應用程序的可重新啟動性。
通常,沒有一種千篇一律的方法來確保您的工作代碼以確保正確處理有狀態(tài)信息的方式編寫。 但是,我將告訴您,您需要考慮以下問題:
- 事務如何完成(分布式,分區(qū),多線程等)
- 如何跟蹤塊進度?
- 您的讀物如何排序/分組?
- 重新啟動時需要什么信息?
這是更新作業(yè)相關(guān)狀態(tài)信息的一般示例:
import org.springframework.batch.item.*; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; /*This could be a reader, or a writer, or maybe a processor... you need to identify when and where it is appropriate to perform these tracking activities. Remember to think about restarts! */ @Component @StepScope public class FooComponent implements ItemStream{ // a perfectly acceptable way to read a value from an ExecutionContext from anywhere! @Value(“#stepExecutionContext[‘fooStatefulCount’]”) long statefulCount = 0; // a read count perhaps?public static final String KEY = "bar"; public void open(ExecutionContext cxt) throws ItemStreamException {cxt.put(KEY, statefulCount); } public void update(ExecutionContext cxt) throws ItemStreamException {cxt.put(KEY, statefulCount); } public void close() throws ItemStreamException {} }如果您想要更全面的示例,請瀏覽AbstractItemCountingItemStreamItemReader中的open方法!
最后的想法
對于其他開發(fā)人員,我的最終建議是在編寫代碼時力求從根本上變得完全普通。 簡單性將使您對未來有所了解,隨后,企業(yè)主將珍惜您的禮物,該應用程序基本上沒有技術(shù)債務。
翻譯自: https://www.javacodegeeks.com/2017/04/spring-batch-restartability.html
總結(jié)
以上是生活随笔為你收集整理的Spring Batch可重启性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sensor Tower:过去十年益智类
- 下一篇: 如何使用Spring设置安全的REST