Proljetna čizma s proljetnom šaržom

1. Pregled

Spring Batch moćan je okvir za razvoj robusnih batch aplikacija. U našem prethodnom tutorialu predstavili smo Spring Batch.

U ovom uputstvu nadogradit ćemo prethodni i naučiti kako postaviti i stvoriti osnovnu batch-pokretanu aplikaciju pomoću Spring Boot-a.

2. Ovisnosti Mavena

Prvo, dodajmo opruga-boot-starter-batch našem pom.xml:

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

Također ćemo dodati org.hsqldb ovisnosti, koja je dostupna i od Maven Central:

 org.hsqldb hsqldb 2.5.1 vrijeme izvođenja 

3. Definiranje jednostavnog proljetnog serijskog posla

Izgradit ćemo posao koji uvozi popis kave iz CSV datoteke, transformira ga pomoću prilagođenog procesora i sprema konačne rezultate u bazu podataka u memoriji.

3.1. Početak rada

Počnimo s definiranjem točke ulaza u prijavu:

@SpringBootApplication javna klasa SpringBootBatchProcessingApplication {javna statička void glavna (String [] args) {SpringApplication.run (SpringBootBatchProcessingApplication.class, args); }}

Kao što vidimo, ovo je standardna aplikacija Spring Boot. Kako želimo koristiti zadane vrijednosti konfiguracije tamo gdje je to moguće, upotrijebit ćemo vrlo lagani skup svojstava konfiguracije aplikacije.

Ova svojstva definirat ćemo u našem src / main / resources / application.properties datoteka:

file.input = popis kave.csv

Ovo svojstvo sadrži mjesto našeg popisa ulaznih kava. Svaka linija sadrži marku, podrijetlo i neke karakteristike naše kave:

Plava planina, Jamajka, Fruity Lavazza, Kolumbija, Strong Folgers, Amerika, Smokey

Kao što ćemo vidjeti, ovo je ravna CSV datoteka, što znači da se Spring može nositi s tim bez ikakvih posebnih prilagodbi.

Dalje ćemo dodati SQL skriptu schema-all.sql stvoriti naše kava tablica za pohranu podataka:

TAPELA ZA KAPANJE AKO POSTOJI; STVORITE TABLICU kava (coffee_id VELIKI IDENTITET NIJE NULTA PRIMARNI KLJUČ, marka VARCHAR (20), podrijetlo VARCHAR (20), karakteristike VARCHAR (30));

Prikladno, Spring Boot automatski će pokrenuti ovu skriptu tijekom pokretanja.

3.2. Razred domene kave

Nakon toga trebat će nam jednostavna klasa domene za čuvanje naših predmeta od kave:

kava javne klase {marka private String; privatno podrijetlo String; osobine privatnog niza; javna kava (marka niza, podrijetlo niza, karakteristike niza) {this.brand = brand; this.origin = podrijetlo; ovo.karakteristike = karakteristike; } // geteri i postavljači}

Kao što je već spomenuto, naš Kava objekt sadrži tri svojstva:

  • Brend
  • Podrijetlo
  • Neke dodatne karakteristike

4. Konfiguracija posla

Sada, na ključnoj komponenti, našoj konfiguraciji posla. Ići ćemo korak po korak, gradeći svoju konfiguraciju i usput objašnjavajući svaki dio:

@Configuration @EnableBatchProcessing javna klasa BatchConfiguration {@Autowired public JobBuilderFactory jobBuilderFactory; @Autowired javni StepBuilderFactory stepBuilderFactory; @Value ("$ {file.input}") privatni niz fileInput; // ...}

Prvo, započinjemo sa standardnim proljećem @Konfiguracija razred. Dalje, dodajemo a @EnableBatchProcessing napomena za naš razred. Značajno, ovo nam daje pristup mnogim korisnim zrnima koja podržavaju radna mjesta i uštedjet će nam puno rada na nogama.

Nadalje, upotreba ove bilješke također nam omogućava pristup dvije korisne tvornice koje ćemo koristiti kasnije prilikom izgradnje konfiguracije posla i koraka poslova.

Za posljednji dio naše početne konfiguracije uključujemo referencu na datoteka.unos imovina koju smo prethodno prijavili.

4.1. Čitatelj i pisac za naš posao

Sada možemo definirati grah čitača u našoj konfiguraciji:

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

Ukratko, naš gore definirani grah čitača traži datoteku koja se zove popis kave.csv i raščlanjuje svaku stavku u Kava objekt.

Isto tako, definiramo grah za pisanje:

@Bean public JdbcBatchItemWriter Writer (DataSource dataSource) {return new JdbcBatchItemWriterBuilder () .itemSqlParameterSourceProvider (new BeanPropertyItemSqlParameterSourceProvider ()), origin (Znak), origin, origin (IN), INSERT INES, INTO .dataSource (dataSource) .build (); }

Ovog puta uključujemo SQL izraz potreban za umetanje jedne stavke kave u našu bazu podataka, vođen svojstvima Java zrna našeg Kava objekt. Lako izvor podataka automatski stvara @EnableBatchProcessing bilješka.

4.2. Sastavljanje posla

Na kraju, moramo dodati stvarne korake posla i konfiguraciju:

@Bean public Job importUserJob (JobCompletionNotificationListener listener, Step1) {return jobBuilderFactory.get ("importUserJob") .incrementer (new RunIdIncrementer ()) .listener (listener) .flow (step1) .end () .build (); } @Bean public Step step1 (JdbcBatchItemWriter Writer) {return stepBuilderFactory.get ("step1"). komad (10) .reader (čitač ()) .procesor (procesor ()) .writer (pisač) .build (); } @Bean javni procesor CoffeeItemProcessor () {vratiti novi CoffeeItemProcessor (); }

Kao što vidimo, naš posao je relativno jednostavan i sastoji se od jednog koraka definiranog u korak 1 metoda.

Pogledajmo što radi ovaj korak:

  • Prvo konfiguriramo svoj korak tako da istovremeno upisuje do deset zapisa koristeći komad (10) deklaracija
  • Zatim podatke o kavi čitamo pomoću zrna čitača koje smo postavili pomoću čitač metoda
  • Dalje, prosljeđujemo svaki svoj predmet kave prilagođenom procesoru gdje primjenjujemo neku prilagođenu poslovnu logiku
  • Na kraju, svaku stavku kave zapisujemo u bazu podataka pomoću programa za pisanje koji smo prethodno vidjeli

S druge strane, naša importUserJob sadrži našu definiciju posla koja sadrži ID pomoću ugrađenog RunIdIncrementer razred. Također smo postavili a JobCompletionNotificationListener, koje koristimo za obavještavanje kad posao završi.

Da bismo dovršili konfiguraciju posla, navodimo svaki korak (iako ovaj posao ima samo jedan korak). Sad imamo savršeno konfiguriran posao!

5. Prilagođeni procesor za kavu

Pogledajmo detaljno prilagođeni procesor koji smo prethodno definirali u našoj konfiguraciji posla:

javna klasa CoffeeItemProcessor implementira ItemProcessor {private static final Logger LOGGER = LoggerFactory.getLogger (CoffeeItemProcessor.class); @Override javni postupak kave (konačna kava za kavu) baca iznimku {String brand = coffee.getBrand (). ToUpperCase (); Izvor niza = coffee.getOrigin (). ToUpperCase (); Značajke niza = coffee.getCharacteristics (). ToUpperCase (); Kava transformedCoffee = nova kava (marka, podrijetlo, karakteristike); LOGGER.info ("Pretvaranje ({}) u ({})", kava, transformedCoffee); povratak transformedCoffee; }}

Od posebnog interesa, PredmetProcesor sučelje nam pruža mehanizam za primjenu određene poslovne logike tijekom izvršenja posla.

Da stvari budu jednostavne, mi definiramo svoje CoffeeItemProcessor, koji uzima ulaz Kava objekt i pretvara svako svojstvo u velika slova.

6. Završetak posla

Uz to ćemo napisati i JobCompletionNotificationListener pružiti povratne informacije kada naš posao završi:

@Preuzmi javnu prazninu afterJob (JobExecution jobExecution) {if (jobExecution.getStatus () == BatchStatus.COMPLETED) {LOGGER.info ("!!! POSAO ZAVRŠEN! Vrijeme za provjeru rezultata"); String query = "SELECT marka, podrijetlo, karakteristike IZ kave"; jdbcTemplate.query (upit, (rs, red) -> nova kava (rs.getString (1), rs.getString (2), rs.getString (3))). forEach (kava -> LOGGER.info ("Pronađeno u bazi podataka. ", kava)); }}

U gornjem primjeru nadjačavamo afterJob metodu i provjerite uspješno završen posao. Štoviše, pokrećemo trivijalni upit kako bismo provjerili je li svaka stavka kave uspješno spremljena u bazu podataka.

7. Pokretanje našeg posla

Sad kad imamo sve na mjestu za vođenje posla, dolazi zabavni dio. Idemo naprijed i vodimo svoj posao:

... 17: 41: 16.336 [glavna] INFO c.b.b.JobCompletionNotificationListener - !!! POSAO ZAVRŠEN! Vrijeme za provjeru rezultata 17: 41: 16.336 [glavna] INFO c.b.b.JobCompletionNotificationListener - Pronađeno u bazi podataka. 17: 41: 16.337 [glavna] INFO c.b.b.JobCompletionNotificationListener - Pronađena u bazi podataka. 17: 41: 16.337 [glavna] INFO c.b.b.JobCompletionNotificationListener - Pronađena u bazi podataka. ... 

Kao što vidimo, posao nam je tekao uspješno, a svaka stavka kave bila je spremljena u bazu podataka kako se očekivalo.

8. Zaključak

U ovom smo članku naučili kako stvoriti jednostavan proljetni paketni posao pomoću Spring Boot-a. Prvo smo započeli definiranjem neke osnovne konfiguracije.

Zatim smo vidjeli kako dodati čitač datoteka i program za pisanje baze podataka. Na kraju smo pogledali kako primijeniti prilagođenu obradu i provjerili je li naš posao uspješno izveden.

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHub-u.


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