Jarná topánka s pružinovou dávkou

1. Prehľad

Spring Batch je výkonný rámec pre vývoj robustných dávkových aplikácií. V našom predchádzajúcom tutoriáli sme predstavili Spring Batch.

V tomto tutoriále budeme stavať na predchádzajúcom a naučíme sa, ako nastaviť a vytvoriť základnú dávkovo riadenú aplikáciu pomocou Spring Boot.

2. Maven závislosti

Najskôr pridajme jar-topánka-štartér-dávka k nášmu pom.xml:

 org.springframework.boot spring-boot-starter-batch 2.4.0.RELEASE 

Pridáme aj org.hsqldb závislosť, ktorá je k dispozícii aj v Maven Central:

 org.hsqldb hsqldb 2.5.1 runtime 

3. Definovanie jednoduchej jarnej dávkovej úlohy

Chystáme sa vytvoriť úlohu, ktorá importuje zoznam káv zo súboru CSV, transformuje ho pomocou vlastného procesora a konečné výsledky uloží do databázy v pamäti..

3.1. Začíname

Začnime definovaním nášho vstupného bodu aplikácie:

@SpringBootApplication verejná trieda SpringBootBatchProcessingApplication {public static void main (String [] args) {SpringApplication.run (SpringBootBatchProcessingApplication.class, args); }}

Ako vidíme, jedná sa o štandardnú aplikáciu Spring Boot. Pretože chceme, kde je to možné, použiť predvolené konfiguračné hodnoty, použijeme veľmi ľahkú sadu vlastností konfigurácie aplikácie.

Tieto vlastnosti si zadefinujeme v našom src / main / resources / application.properties spis:

file.input = coffee-list.csv

Táto vlastnosť obsahuje umiestnenie nášho vstupného kávového zoznamu. Každý riadok obsahuje značku, pôvod a niektoré vlastnosti našej kávy:

Blue Mountain, Jamajka, Fruity Lavazza, Colombia, Strong Folgers, America, Smokey

Ako uvidíme, jedná sa o plochý súbor CSV, čo znamená, že Spring to zvládne bez akejkoľvek špeciálnej úpravy.

Ďalej pridáme skript SQL schema-all.sql aby sme vytvorili našu káva tabuľka na uloženie údajov:

DROP TABLE káva, AK EXISTUJE; CREATE TABLE coffee (coffee_id BIGINT IDENTITY NOT NULL PRIMARY KEY, značka VARCHAR (20), pôvod VARCHAR (20), charakteristika VARCHAR (30));

Pohodlne Spring Boot spustí tento skript automaticky počas spustenia.

3.2. Trieda domény kávy

Následne budeme potrebovať jednoduchú doménovú triedu na uskladnenie našich kávových položiek:

public class Coffee {private String brand; súkromný pôvod reťazca; súkromné ​​charakteristiky reťazca; verejná káva (značka reťazca, pôvod reťazca, charakteristika reťazca) {this.brand = značka; this.origin = pôvod; this.characteristics = charakteristiky; } // zakladatelia a zakladatelia}

Ako už bolo spomenuté, naše Káva objekt obsahuje tri vlastnosti:

  • Značka
  • Pôvod
  • Niektoré ďalšie charakteristiky

4. Konfigurácia úlohy

Teraz, ku kľúčovému komponentu, našej konfigurácii úloh. Pôjdeme krok za krokom, zostavíme našu konfiguráciu a vysvetlíme každú časť pozdĺž tejto cesty:

@Configuration @EnableBatchProcessing verejná trieda BatchConfiguration {@Autowired public JobBuilderFactory jobBuilderFactory; @Autowired public StepBuilderFactory stepBuilderFactory; @Value ("$ {file.input}") private String fileInput; // ...}

Najprv začneme štandardnou pružinou @ Konfigurácia trieda. Ďalej pridáme a @EnableBatchProcessing anotácia k našej triede. To nám dáva predovšetkým prístup k mnohým užitočným fazuľkám, ktoré podporujú pracovné miesta a ušetria nám veľa práce s nohami.

Ďalej nám použitie tejto anotácie poskytuje prístup k dvom užitočným továrňam, ktoré neskôr použijeme pri zostavovaní konfigurácie úlohy a krokov úloh.

Pre poslednú časť našej pôvodnej konfigurácie uvádzame odkaz na file.input majetok, ktorý sme deklarovali predtým.

4.1. Čitateľ a spisovateľ pre našu prácu

Teraz môžeme pokračovať a definovať fazuľa čítačky v našej konfigurácii:

@Bean public FlatFileItemReader reader () {return new FlatFileItemReaderBuilder (). Name ("coffeeItemReader") .resource (new ClassPathResource (fileInput)) .delimited () .names (new String [] {"brand", "origin", " charakteristiky "}) .fieldSetMapper (nový BeanWrapperFieldSetMapper () {{setTargetType (Coffee.class);}}) .build (); }

V skratke, naša čiara čitateľa definovaná vyššie hľadá súbor s názvom coffee-list.csv a každú riadkovú položku analyzuje na a Káva objekt.

Rovnako definujeme fazuľa spisovateľa:

@Bean public JdbcBatchItemWriter spisovateľ (DataSource dataSource) {vrátiť nový JdbcBatchItemWriterBuilder () .itemSqlParameterSourceProvider (nový BeanPropertyItemSqlParameterSourceProvider ()) .sql ("VLOŽIŤ:, vlastnosti:"), vlastnosti: .dataSource (dataSource) .build (); }

Tentokrát zahrnieme príkaz SQL potrebný na vloženie jednej kávovej položky do našej databázy na základe vlastností Java bean našej Káva objekt. Šikovne dátový zdroj je automaticky vytvorený používateľom @EnableBatchProcessing anotácia.

4.2. Spojenie našej práce

Nakoniec musíme pridať skutočné kroky a konfiguráciu úlohy:

@Bean public Job importUserJob (JobCompletionNotificationListener poslucháč, krok krok 1) {návrat jobBuilderFactory.get ("importUserJob") .incrementer (nový RunIdIncrementer ()) .listener (listener) .flow (krok1) .end () .build (); } @Bean public Step step1 (JdbcBatchItemWriter writer) {return stepBuilderFactory.get ("step1"). chunk (10) .reader (reader ()) .procesor (processor ()) .writer (writer) .build (); } @Bean public CoffeeItemProcessor processor () {return new CoffeeItemProcessor (); }

Ako vidíme, naša práca je pomerne jednoduchá a pozostáva z jedného kroku definovaného v krok 1 metóda.

Pozrime sa, čo tento krok robí:

  • Najskôr nakonfigurujeme náš krok tak, aby pomocou protokolu zapisoval naraz až desať záznamov kus (10) vyhlásenie
  • Potom sme pomocou kávového zrna, ktoré sme nastavili pomocou, načítali údaje o káve čitateľ metóda
  • Ďalej odovzdáme každú z našich kávových položiek do vlastného procesora, kde použijeme vlastnú obchodnú logiku
  • Nakoniec každú položku kávy zapíšeme do databázy pomocou zapisovača, ktorý sme videli predtým

Na druhej strane náš importUserJob obsahuje našu definíciu úlohy, ktorá obsahuje ID pomocou zabudovaného modulu RunIdIncrementer trieda. Nastavili sme aj a JobCompletionNotificationListener, ktoré používame na získanie upozornenia na dokončenie úlohy.

Na dokončenie konfigurácie úlohy uvádzame zoznam všetkých krokov (aj keď má táto úloha iba jeden krok). Teraz máme perfektne nakonfigurovanú prácu!

5. Vlastný kávovar

Pozrime sa podrobne na vlastný procesor, ktorý sme definovali predtým v našej konfigurácii úloh:

verejná trieda CoffeeItemProcessor implementuje ItemProcessor {private static final Logger LOGGER = LoggerFactory.getLogger (CoffeeItemProcessor.class); @ Override public Coffee process (final Coffee coffee) throws Exception {String brand = coffee.getBrand (). ToUpperCase (); Pôvod reťazca = coffee.getOrigin (). ToUpperCase (); Charakteristiky reťazca = coffee.getCharacteristics (). ToUpperCase (); Káva transformovanáKáva = nová káva (značka, pôvod, vlastnosti); LOGGER.info ("Konverzia ({}) na ({})", káva, transformovanáKáva); návrat transformovanáKáva; }}

Obzvlášť zaujímavé je ItemProcessor rozhranie nám poskytuje mechanizmus na použitie určitej konkrétnej obchodnej logiky počas vykonávania úlohy.

Aby to nebolo jednoduché, definujeme svoje CoffeeItemProcesor, ktorý berie vstup Káva objekt a transformuje každú z vlastností na veľké písmená.

6. Dokončenie úlohy

Ďalej tiež napíšeme a JobCompletionNotificationListener poskytnúť spätnú väzbu po dokončení našej práce:

@Override public void afterJob (JobExecution jobExecution) {if (jobExecution.getStatus () == BatchStatus.COMPLETED) {LOGGER.info ("!!! ÚLOHA SÚČASNE! Čas na overenie výsledkov"); Reťazcový dopyt = "VYBERTE značku, pôvod, vlastnosti Z KÁVY"; jdbcTemplate.query (dopyt, (rs, riadok) -> nová káva (rs.getString (1), rs.getString (2), rs.getString (3))) .forEach (káva -> LOGGER.info („Nájdené v databáze. “, káva)); }}

Vo vyššie uvedenom príklade prepíšeme afterJob metódou a skontrolujte úlohu úspešne dokončenú. Ďalej spustíme triviálny dotaz na kontrolu toho, či bola každá položka kávy úspešne uložená v databáze.

7. Prevádzka našej práce

Teraz, keď máme všetko pripravené na vykonávanie našej práce, prichádza zábavná časť. Poďme do toho a rozbehnime svoju prácu:

... 17: 41: 16 336 [hlavné] INFO c.b.b.JobCompletionNotificationListener - !!! PRÁCA SÚČASNÁ! Čas na overenie výsledkov 17: 41: 16 336 [hlavné] INFO c.b.b.JobCompletionNotificationListener - nájdené v databáze. 17: 41: 16,337 [hlavné] INFO c.b.b.JobCompletionNotificationListener - nájdené v databáze. 17: 41: 16.337 [hlavné] INFO c.b.b.JobCompletionNotificationListener - nájdené v databáze. ... 

Ako vidíme, naša práca prebehla úspešne a každá položka kávy bola podľa očakávania uložená v databáze.

8. Záver

V tomto článku sme sa naučili, ako vytvoriť jednoduchú úlohu Spring Batch pomocou Spring Boot. Najskôr sme začali definovaním základnej konfigurácie.

Potom sme videli, ako pridať čítačku súborov a zapisovač databázy. Nakoniec sme sa pozreli na to, ako uplatniť niektoré vlastné spracovanie a skontrolovať, či sa naša úloha úspešne vykonala.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


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