Konfiguriranje logike preskakanja u Spring Batchu

1. Uvod

Prema zadanim postavkama, sve pogreške koje se nađu tijekom obrade proljetnog skupnog posla uzrokovat će neuspjeh odgovarajućeg koraka. Međutim, postoje mnoge situacije u kojima bismo za određene iznimke radije preskočili trenutno obrađenu stavku.

U ovom vodiču, istražit ćemo dva pristupa za konfiguriranje logike preskakanja u okviru Spring Batch.

2. Naš slučaj upotrebe

U svrhu primjera, ponovno ćemo upotrijebiti jednostavan posao usmjeren na dijelove predstavljen već u našem uvodnom članku Spring Batch.

Ovaj posao pretvara neke financijske podatke iz CSV u XML format.

2.1. Ulazni podaci

Prvo dodamo nekoliko redaka izvornoj CSV datoteci:

korisničko ime, user_id, datum_transakcije, iznos_transakcije_devendra, 1234, 31.10.2015., 10000 John, 2134, 12.3.2015., 12321 robin, 2134, 2.2.2015., 23411, 2536, 10.3.2019., 100 mike, 9876, 11.5.2018., -500, 3425, 10.10.2017., 9999

Kao što vidimo, posljednja tri retka sadrže neke nevaljane podatke - u retcima 5 i 7 nedostaje polje za korisničko ime, a iznos transakcije u retku 6 je negativan.

U kasnijim odjeljcima konfigurirat ćemo naš batch posao da preskoči ove oštećene zapise.

3. Konfiguriranje ograničenja preskakanja i iznimki koje se mogu preskočiti

3.1. Koristeći preskočiti i preskočiOgraniči

Razgovarajmo sada o prvom od dva načina za konfiguriranje posla za preskakanje stavki u slučaju kvara - preskočiti i preskočiOgraniči metode:

@Bean public Step skippingStep (ProcessProcessor Processor, Writer ItemWriter) baca ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)) .processor (processor) .writer (Writer). DefaultTolerant ) .skipLimit (2) .skip (MissingUsernameException.class) .skip (NegativeAmountException.class) .build (); }

Kao prvo, da bismo omogućili funkciju preskakanja, moramo uključiti poziv na faultTolerant () tijekom postupka izgradnje koraka.

Unutar preskočiti() i skipLimit (), definiramo iznimke koje želimo preskočiti i maksimalan broj preskočenih stavki.

U gornjem primjeru, ako je bilo koji od a MissingUsernameException ili NegativeAmountException se baci tijekom faze čitanja, obrade ili pisanja, tada će trenutno obrađena stavka biti izostavljena i ubrojana u ukupno ograničenje od dvije.

Slijedom toga, ako se bilo koja iznimka baci treći put, tada cijeli korak neće uspjeti.

3.1. Koristeći noSkip

U prethodnom primjeru, bilo koja druga iznimka osim MissingUsernameException i NegativeAmountException čini da naš korak propadne.

Međutim, u nekim bi situacijama moglo biti prikladnije prepoznati iznimke zbog kojih bi naš korak propao i preskočiti bilo koji drugi.

Pogledajmo kako to možemo konfigurirati pomoću preskočiti, preskočiOgraniči, i noSkip:

@Bean public Step skippingStep (ProcessProcessor Processor, Writer ItemWriter) baca ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)) .processor (processor) .writer (Writer). DefaultTolerant ) .skipLimit (2) .skip (Iznimka.razred) .noSkip (SAXException.class) .build (); }

Uz gornju konfiguraciju, naređujemo Spring Batch okviru da preskoči bilo koji Iznimka (unutar konfiguriranog ograničenja) osim SAXException. To znači SAXException uvijek uzrokuje neuspjeh koraka.

Redoslijed preskočiti() i noSkip () pozivi nisu važni.

4. Korištenje Custom SkipPolicy

Ponekad će nam trebati sofisticiraniji mehanizam za provjeru preskakanja. U tu svrhu, Spring Batch okvir pruža SkipPolicy sučelje.

Tada možemo pružiti vlastitu implementaciju logike preskakanja i uključiti je u našu definiciju koraka.

Imajući na umu prethodni primjer, zamislite da i dalje želimo definirati ograničenje preskakanja dvije stavke i napraviti samo MissingUsernameException i NegativeAmountException moguće preskočiti.

Međutim, dodatno ograničenje je da možemo preskočiti NegativeAmountException, ali samo ako iznos ne prelazi definiranu granicu.

Provedimo svoj običaj SkipPolicy:

javna klasa CustomSkipPolicy implementira SkipPolicy {private static final int MAX_SKIP_COUNT = 2; privatni statički konačni int INVALID_TX_AMOUNT_LIMIT = -1000; @Override public boolean shouldSkip (Može se baciti, int skipCount) baca SkipLimitExceededException {if (bacljiva instanca MissingUsernameException && skipCount <MAX_SKIP_COUNT) {return true; } if (bacljiva instanca NegativeAmountException && skipCount <MAX_SKIP_COUNT) {NegativeAmountException ex = (NegativeAmountException) bacljiva; if (ex.getAmount () <INVALID_TX_AMOUNT_LIMIT) {return false; } else {vratiti true; }} return false; }}

Sada svoju prilagođenu politiku možemo koristiti u definiciji koraka:

 @Bean public Step skippingStep (ProcessProcessor Processor, Writer ItemWriter) baca ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)) .processor (processor) .writer (Writer). DefaultTolerant ) .skipPolicy (novi CustomSkipPolicy ()) .build (); }

I, slično našem prethodnom primjeru, i dalje moramo koristiti faultTolerant () kako bi se omogućila funkcionalnost preskakanja.

Ovaj put, međutim, ne zovemo preskočiti() ili noSkip (). Umjesto toga, koristimo skipPolicy () metoda za pružanje vlastite provedbe SkipPolicy sučelje.

Kao što vidimo, ovaj pristup daje nam veću fleksibilnost, pa može biti dobar izbor u određenim slučajevima korištenja.

5. Zaključak

U ovom smo priručniku predstavili dva načina kako učiniti Spring Batch posao otpornim na kvarove.

Iako se pomoću a skipLimit () zajedno s preskočiti() i noSkip () Čini se da su metode popularnije, možda ćemo primijeniti prilagođavanje SkipPolicy biti prikladniji u nekim situacijama.

Kao i obično, svi primjeri koda dostupni su na GitHubu.


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