Logica voor overslaan configureren in Spring Batch

1. Inleiding

Standaard zullen fouten die worden aangetroffen tijdens het verwerken van een Spring Batch-taak een overeenkomstige stap mislukken. Er zijn echter veel situaties waarin we het momenteel verwerkte item liever overslaan voor bepaalde uitzonderingen.

In deze tutorial we zullen twee benaderingen onderzoeken om de logica voor overslaan in het Spring Batch-framework te configureren.

2. Onze use case

Ten behoeve van voorbeelden, we hergebruiken een eenvoudige, brok-georiënteerde taak die al in ons Spring Batch-inleidende artikel is gepresenteerd.

Deze taak converteert een aantal financiële gegevens van een CSV- naar XML-indeling.

2.1. Invoergegevens

Laten we eerst een paar rijen toevoegen aan het originele CSV-bestand:

gebruikersnaam, gebruikers-id, transactiedatum, transactiebedrag devendra, 1234, 31/10/2015, 10000 john, 2134, 3/12/2015, 12321 robin, 2134, 2/02/2015, 23411, 2536, 10/03/2019, 100 mike, 9876, 5/11/2018, -500, 3425, 10/10/2017, 9999

Zoals we kunnen zien, bevatten de laatste drie rijen enkele ongeldige gegevens - rijen 5 en 7 missen het gebruikersnaamveld en het transactiebedrag in rij 6 is negatief.

In de latere secties zullen we onze batchtaak configureren om deze beschadigde records over te slaan.

3. Configuratie van limiet voor overslaan en uitzonderingen die kunnen worden overgeslagen

3.1. Gebruik makend van overspringen en skipLimit

Laten we nu de eerste van twee manieren bespreken om onze taak te configureren om items over te slaan in het geval van een storing - het overspringen en skipLimit methoden:

@Bean public Step skippingStep (ItemProcessor-processor, ItemWriter-schrijver) gooit ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)) .processor (processor) .writer (schrijver) .faultTolerant ( ) .skipLimit (2) .skip (MissingUsernameException.class) .skip (NegativeAmountException.class) .build (); }

Allereerst, om de functie voor overslaan in te schakelen, moeten we een aanroep naar faultTolerant () tijdens het stapsgewijze opbouwproces.

Binnen overspringen() en skipLimit (), definiëren we de uitzonderingen die we willen overslaan en het maximale aantal overgeslagen items.

Als in het bovenstaande voorbeeld een MissingUsernameException of NegativeAmountException wordt gegenereerd tijdens de lees-, verwerkings- of schrijffase, dan wordt het momenteel verwerkte item weggelaten en geteld voor de totale limiet van twee.

Bijgevolg, als een uitzondering voor de derde keer wordt gegenereerd, mislukt de hele stap.

3.1. Gebruik makend van noSkip

In het vorige voorbeeld zijn er behalve MissingUsernameException en NegativeAmountException laat onze stap mislukken.

In sommige situaties kan het echter geschikter zijn identificeer uitzonderingen die onze stap zouden moeten laten mislukken en alle andere zouden moeten overslaan.

Laten we eens kijken hoe we dit kunnen configureren met overspringen, skipLimit, en noSkip:

@Bean public Step skippingStep (ItemProcessor-processor, ItemWriter-schrijver) gooit ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)) .processor (processor) .writer (schrijver) .faultTolerant ( ) .skipLimit (2) .skip (Exception.class) .noSkip (SAXException.class) .build (); }

Met de bovenstaande configuratie geven we het Spring Batch-framework de opdracht om elk Uitzondering (binnen een geconfigureerde limiet) behalve SAXException. Dit betekent SAXException veroorzaakt altijd een stapsgewijze mislukking.

De volgorde van de overspringen() en noSkip () telefoontjes doen er niet toe.

4. Aangepast gebruiken Beleid overslaan

Soms hebben we misschien een meer geavanceerd mechanisme voor het controleren van overslaan nodig. Met dat doel, Spring Batch-framework biedt het Beleid overslaan koppel.

We kunnen dan onze eigen implementatie van logica voor overslaan bieden en deze in onze stapdefinitie pluggen.

Met het voorgaande voorbeeld in gedachten, stel je voor dat we nog steeds een skip-limiet van twee items willen definiëren en alleen make MissingUsernameException en NegativeAmountException kan worden overgeslagen.

Echter, een extra beperking is dat we kunnen overslaan NegativeAmountException, maar alleen als het bedrag een bepaalde limiet niet overschrijdt.

Laten we onze gewoonte implementeren Beleid overslaan:

openbare klasse CustomSkipPolicy implementeert SkipPolicy {privé statische finale int MAX_SKIP_COUNT = 2; privé statische laatste int INVALID_TX_AMOUNT_LIMIT = -1000; @Override openbare boolean shouldSkip (Throwable throwable, int skipCount) gooit 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; }}

Nu kunnen we ons aangepaste beleid gebruiken in een stapdefinitie:

 @Bean public Step skippingStep (ItemProcessor-processor, ItemWriter-schrijver) gooit ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)) .processor (processor) .writer (schrijver) .faultTolerant ( ) .skipPolicy (nieuwe CustomSkipPolicy ()) .build (); }

En, net als in ons vorige voorbeeld, moeten we nog steeds gebruiken faultTolerant () om de functie voor overslaan in te schakelen.

Deze keer bellen we echter niet overspringen() of noSkip (). In plaats daarvan, wij gebruiken de skipPolicy () methode om onze eigen implementatie van de Beleid overslaan koppel.

Zoals we kunnen zien, deze benadering geeft ons meer flexibiliteit, dus het kan in bepaalde gevallen een goede keuze zijn.

5. Conclusie

In deze tutorial hebben we twee manieren gepresenteerd om een ​​Spring Batch-taak fouttolerant te maken.

Ook al gebruik je een skipLimit () samen met overspringen() en noSkip () methoden lijkt populairder te zijn, kunnen we het implementeren van een aangepaste Beleid overslaan om in sommige situaties handiger te zijn.

Zoals gewoonlijk zijn alle codevoorbeelden beschikbaar op GitHub.