Konfigurácia Preskočiť logiku v Spring Batch

1. Úvod

V predvolenom nastavení všetky chyby, ktoré sa vyskytnú počas spracovania úlohy Spring Batch, spôsobia zlyhanie príslušného kroku. Existuje však veľa situácií, kedy by sme najradšej preskočili práve spracovanú položku pre určité výnimky.

V tomto návode preskúmame dva prístupy ku konfigurácii logiky preskočenia v rámci Spring Batch.

2. Náš prípad použitia

Na účely príkladov znova použijeme jednoduchú prácu zameranú na jednotlivé časti, ktorú sme už predstavili v našom úvodnom článku Spring Batch.

Táto úloha prevádza niektoré finančné údaje z formátu CSV do formátu XML.

2.1. Vstupné Data

Najprv do pôvodného súboru CSV pridáme niekoľko riadkov:

používateľské meno, identifikátor používateľa, dátum transakcie, suma transakcie devendra, 1234, 31/10/2015, 10 000 john, 2134, 12.12.2015, 12321 robin, 2134, 2.2.2015, 23411, 2536, 10.3.2019, 100 mike, 9876, 5. 11. 2018, -500, 3425, 10. 10. 2017, 9999

Ako vidíme, posledné tri riadky obsahujú neplatné údaje - v riadkoch 5 a 7 chýba pole používateľského mena a suma transakcie v riadku 6 je záporná.

V ďalších častiach nakonfigurujeme našu dávkovú úlohu tak, aby tieto poškodené záznamy preskočila.

3. Konfigurácia limitu preskočenia a preskočiteľných výnimiek

3.1. Použitím preskočiť a skipLimit

Poďme si teraz predstaviť prvý z dvoch spôsobov, ako nakonfigurovať našu prácu tak, aby v prípade zlyhania preskočila položky - preskočiť a skipLimit metódy:

@Bean public Step skippingStep (procesor ItemProcessor, zapisovač ItemWriter) hodí ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)) .processor (procesor) .writer (zapisovač). DefaultTolerant ( ) .skipLimit (2) .skip (MissingUsernameException.class) .skip (NegativeAmountException.class) .build (); }

Po prvé, aby sme povolili funkciu preskočenia, musíme zahrnúť hovor na odolné proti chybám() počas procesu budovania krokov.

V rámci preskočiť () a skipLimit (), definujeme výnimky, ktoré chceme preskočiť, a maximálny počet preskočených položiek.

Vo vyššie uvedenom príklade, ak buď a MissingUsernameException alebo NegativeAmountException sa hodí počas fázy čítania, spracovania alebo zápisu, potom sa aktuálne spracovaná položka vynechá a započíta sa do celkového limitu dvoch.

V dôsledku toho ak sa niektorá výnimka hodí tretíkrát, celý krok zlyhá.

3.1. Použitím noSkip

V predchádzajúcom príklade akákoľvek iná výnimka okrem MissingUsernameException a NegativeAmountException náš krok zlyhá.

V niektorých situáciách však môže byť vhodnejšie identifikovať výnimky, vďaka ktorým by náš krok mal zlyhať, a preskočiť ktorékoľvek iné.

Pozrime sa, ako to môžeme nakonfigurovať pomocou preskočiť, skipLimita noSkip:

@Bean public Step skippingStep (procesor ItemProcessor, zapisovač ItemWriter) hodí ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)) .processor (procesor) .writer (zapisovač). DefaultTolerant ( ) .skipLimit (2) .skip (Exception.class) .noSkip (SAXException.class) .build (); }

S vyššie uvedenou konfiguráciou dávame rámcu Spring Batch pokyn, aby preskočil na ľubovoľné Výnimka (v rámci nakonfigurovaného limitu) okrem Výnimka SAX. To znamená Výnimka SAX vždy spôsobí zlyhanie kroku.

Poradie preskočiť () a noSkip () na hovoroch nezáleží.

4. Používanie možnosti Vlastné SkipPolicy

Niekedy možno budeme potrebovať zložitejší mechanizmus kontroly preskočenia. Z tohto dôvodu Rámec Spring Batch poskytuje SkipPolicy rozhranie.

Potom môžeme poskytnúť našu vlastnú implementáciu logiky preskočenia a zapojiť ju do našej definície kroku.

Pamätajte na predchádzajúci príklad a predstavte si, že stále chceme definovať limit preskočenia dvoch položiek a urobiť iba MissingUsernameException a NegativeAmountException preskočiteľné.

Avšak ďalšie obmedzenie je, že môžeme preskočiť NegativeAmountException, ale iba ak suma nepresiahne stanovený limit.

Implementujme náš zvyk SkipPolicy:

verejná trieda CustomSkipPolicy implementuje SkipPolicy {private static final int MAX_SKIP_COUNT = 2; súkromný statický konečný int INVALID_TX_AMOUNT_LIMIT = -1000; @Override public boolean shouldSkip (Throwable throwable, int skipCount) throws SkipLimitExceededException {if (throwable instanceof MissingUsernameException && skipCount <MAX_SKIP_COUNT) {return true; } if (throwable instanceof NegativeAmountException && skipCount <MAX_SKIP_COUNT) {NegativeAmountException ex = (NegativeAmountException) throwable; if (ex.getAmount () <INVALID_TX_AMOUNT_LIMIT) {return false; } else {return true; }} return false; }}

Teraz môžeme našu vlastnú politiku použiť v definícii kroku:

 @Bean public Step skippingStep (procesor ItemProcessor, zapisovač ItemWriter) hodí ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)) .processor (procesor) .writer (zapisovač). DefaultTolerant ( ) .skipPolicy (new CustomSkipPolicy ()) .build (); }

A podobne ako v predchádzajúcom príklade musíme ešte použiť odolné proti chybám() povoliť funkciu preskočenia.

Tentokrát sa však neozývame preskočiť () alebo noSkip (). Namiesto toho používame skipPolicy () metóda na zabezpečenie našej vlastnej implementácie SkipPolicy rozhranie.

Ako vidíme, tento prístup nám poskytuje väčšiu flexibilitu, takže v určitých prípadoch použitia môže byť dobrou voľbou.

5. Záver

V tomto tutoriáli sme predstavili dva spôsoby, ako zaistiť, aby práca Spring Batch odolávala chybám.

Aj napriek tomu, že použitie a skipLimit () spolu s preskočiť () a noSkip () metódy sa javia ako populárnejšie, môžeme nájsť implementáciu zvyku SkipPolicy aby to bolo v niektorých situáciách pohodlnejšie.

Ako obvykle sú všetky príklady kódov k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found