Spring Batch – mo‡an alat za batch obrade -

Preview:

Citation preview

MLADEN TRBOJEVIĆ

Spring Batch – moćan alat za batch obrade podataka

Batch obrade podataka

Batch obrade – skupne, serijske obrade velikih količina podataka bez potrebe za interakcijom s korisnicima

Vremenski određeni događaji

Periodična primjena poslovnih pravila nad velikih skupom podataka

Integracija informacija iz drugih dijelova organizacije ili iz vanjskog svijeta

Spring Batch

Spring Batch

Open source alat

Sveobuhvatna podrška za batch obrade

Gotove, ponovno iskoristive funkcije za obradu velikih količina podataka:

Loggiranje

Upravljanje transakcijama

Skupljane statistike o izvršavanju poslova

Ponovno pokretanje poslova

Upravljanje resursima

Nije radni okvir za scheduliranje!

Spring Batch

Scenariji korištenja

Poslovni scenariji:

Batch obradu periodično potvrditi (commit)

Konkurentna obrada – paralelno izvođenje zadataka

Ručno ili automatizirano restartanje uslijed prekida ili greške

Slijedna obrada međusobno zavisnih koraka

Djelomična obrada: preskakanje zapisa

Cijela obrada kao jedna transakcija - skup podataka za obradu relativno malen

Spring Batch

Scenariji korištenja (2)

Tehnički ciljevi:

Batch developeri koriste Spring model programiranja; mogu se koncentrirati na poslovnu logiku, a radni okvir vodi brigu o infrastrukturi

Razdvajanje odgovornosti između infrastrukture, okoline za izvođenje obrade i same aplikacije za batch obradu

Pružiti osnovne, uobičajene servise kao sučelja koja mogu implementirati svi projekti

Pružiti jednostavne, defaultne implementacije osnovnih sučelja za izvođenje koji se mogu koristiti odmah (out of the box)

Spring Batch

Scenariji korištenja (3)

Tehnički ciljevi:

Omogućiti jednostavno konfiguriranje, prilagođavanje i proširivanje servisa pomoću Spring radnog okvira

Svi postojeći osnovni servisi moraju se moći jednostavno zamijeniti ili proširiti, bez utjecaja na infrastrukturni sloj

Spring Batch

Spring Batch arhitektura

Spring Batch

Osnovni koncepti Spring Batcha

Spring Batch

JobLauncher Step Job

ItemReader

ItemProcessor

ItemWriter

JobRepository

1 *

1

1

1

1 1

1

Job

Job – konfiguracija zadatka

Job sadrži korake (Steps) koji su logički povezani

U konfiguraciji se jobu pridružuje ime i određuje da li se može ponovno pokrenuti

Spring Batch

Job - primjer

<job id="footballJob">

<step id="playerload" next="gameLoad"/>

<step id="gameLoad" next="playerSummarization"/>

<step id="playerSummarization"/>

</job>

Spring Batch

JobInstance, JobExecution

Spring Batch

Job ZavrsetakDana zadatak

JobInstance

JobExecution

ZavrsetakDana zadatak za dan 01.06.2013.

Prvi pokušaj izvođenja zadatka ZavrsetakDana za dan 01.06.2013.

*

*

Step

Svaki zadatak (job) se sastoji od jednog ili više koraka

Korak predstavlja neovisnu, slijednu fazu batch zadatka

Korak može biti jednostavan ili složen

Spring Batch

Konfiguriranje i izvršavanje zadatka

Job ima tri obavezne zavisnosti: ime, JobRepository i listu koraka

<job id="footballJob">

<step id="playerload" parent="s1" next="gameLoad"/>

<step id="gameLoad" parent="s2" next="playerSummarization"/>

<step id="playerSummarization" parent="s3"/>

</job>

Spring Batch

Ponovno pokretanje

Zadaci u Spring Batchu mogu se ponovno pokrenuti u slučaju neuspjeha

Postoje scenariji kada to ponašanje nije poželjno

<job id="footballJob" restartable="false">

...

</job>

Spring Batch

Nasljeđivanje od roditeljskog zadatka

Kada grupa zadataka ima slične, ali ne potpuno iste konfiguracije

<job id="baseJob" abstract="true"> <listeners> <listener ref="listenerOne"/> </listeners> </job> <job id="job1" parent="baseJob"> <step id="step1" parent="standaloneStep"/> <listeners merge="true"> <listener ref="listenerTwo"/> </listeners> </job>

Spring Batch

Konfiguriranje JobRepository-a

JobRepository se koristi za osnovne CRUD operacije za različite domenske objekte u Spring Batchu (JobExecution, StepExecution)

Koriste ga mnogi dijelovi radnog okvira (JobLauncher, Job, Step)

<job-repository id="jobRepository"

data-source="dataSource"

transaction-manager="transactionManager"

isolation-level-for-create="SERIALIZABLE"

table-prefix="BATCH_"

max-varchar-length="1000"

/>

Spring Batch

Konfiguriranje JobLaunchera

<bean id="jobLauncher"

class="org.springframework.batch.core.launch.support.SimpleJobLauncher">

<property name="jobRepository" ref="jobRepository" />

</bean>

Jedina obavezna zavisnost za SimpleJobLauncher je repozitorij, jer se preko njega dohvaća JobExecution

Spring Batch

JobLauncher

Spring Batch

Job JobLauncher Client Business

run() execute()

ExitStatus

JobExecution Sa ExitStatus.FINISHED ili FAILED

Izvođenje zadatka

Za pokretanje zadatka potrebne su minimalno dvije stvari: Job i JobLauncher

Job se najčešće pokreće iz komandne linije ili iz web kontejnera

CommandLineJobRunner

bash$ java CommandLineJobRunner ZavrsteakDanaJob.xml ZavrsteakDana schedule.date(date)=2013/06/01

Spring Batch

Izvođenje zadatka (2)

Web kontejner

Spring Batch

Job JobLauncher Controller

run() execute()

JobExecution

Izvođenje zadatka (3)

@Controller public class JobLauncherController {

@Autowired JobLauncher jobLauncher; @Autowired Job job; @RequestMapping("/jobLauncher.html") public void handle() throws Exception{ jobLauncher.run(job, new JobParameters()); }

}

Spring Batch

Napredno korištenje meta podataka

JobExplorer sučelje – dohvaćanje podataka iz repozitorija o postojećim izvršavanjima zadataka

JobRegistry – koristan ako nas zanima koji su sve zadaci dostupni u kontekstu

JobOperator – služi za zaustavljanje, ponovno pokretanje ili dohvaćanje sažetka o zadatku

Spring Batch

Konfiguriranje koraka

Step je domenski objekt koji predstavlja nezavisnu, slijednu fazu batch obrade

Spring Batch

Step

ItemReader

ItemProcessor

ItemWriter

Obrada u blokovima podataka

Spring Batch

ItemReader Step ItemProcessor ItemWriter

execute()

read()

item

read()

item

process(item)

item

process(item)

item

write(items)

ExitStatus

Konfiguriranje koraka (2)

<job id="sampleJob" job-repository="jobRepository">

<step id="step1">

<tasklet transaction-manager="transactionManager">

<chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>

</tasklet>

</step>

</job>

Spring Batch

Logika preskakanja (zanemarivanja)

<step id="step1">

<tasklet>

<chunk reader="flatFileItemReader" writer="itemWriter"

commit-interval="10" skip-limit="10">

<skippable-exception-classes>

<include class="org.springframework.batch.item.file.FlatFileParseException"/>

</skippable-exception-classes>

</chunk>

</tasklet>

</step>

Spring Batch

TaskletStep

Obrada u blokovima podataka nije jedini način konfiguracije koraka

Na primjer, poziv procedure u bazi podataka

<step id="step1"> <tasklet ref="myTasklet"/> </step> <bean id="myTasklet"

class="org.springframework….MethodInvokingTaskletAdapter"> <property name="targetObject"> <bean class="org.mycompany.FooDao"/> </property> <property name="targetMethod" value="updateFoo" />

</bean>

Spring Batch

Kontroliranje slijeda koraka

Slijedni tijek koraka

Spring Batch

Step A

Step B

Step C

Kontroliranje slijeda koraka (2)

Uvjetovani slijed koraka

Spring Batch

Step A

Step B Step C

Uspješno?

DA NE

Kontroliranje slijeda koraka (3)

<job id="job">

<step id="stepA" parent="s1">

<next on="*" to="stepB" />

<next on="FAILED" to="stepC" />

</step>

<step id="stepB" parent="s2" next="stepC" />

<step id="stepC" parent="s3" />

</job>

Spring Batch

ItemReaderi i ItemWriteri

ItemReader – sredstvo za učitavanje podataka iz različitih tipova ulaza

FlatFile Item Readers

XML Item Readers

Database Item Readers

Sučelje za generičke ulazne operacije

public interface ItemReader<T> {

T read() throws Exception, UnexpectedInputException, ParseException;

}

Spring Batch

ItemReaderi i ItemWriteri (2)

ItemWriter – sličan kao i Reader, samo za izlazne operacije

public interface ItemWriter<T> {

void write(List<? extends T> items) throws Exception;

}

ItemProcessor

public interface ItemProcessor<I, O> {

O process(I item) throws Exception;

}

Spring Batch

Primjer iz prakse

1. Skinuti XML datoteku s web stranice

2. Ažurirati udruženja obrtnika s podacima iz datoteke

3. Skinuti zip arhivu s web stranice

4. U bazi podataka obrisati stare podatke

5. Iz skinute zip arhive popuniti bazu novim podacima o djelatnostima

6. Poslati mail u slučaju da je sve prošlo OK

Spring Batch

Primjer iz prakse

<job id="updateUdruzenjaJob" xmlns="http://www.springframework.org/schema/batch"> <step id="downloadHokDatoteku" parent="simpleStep"

next="updateUdruzenja"> <tasklet ref="downloadFileUdruzenja"/> </step> <step id="updateUdruzenja" parent="simpleStep"

next="downloadExportIgeaPismoDatoteku"> <tasklet>

<chunk reader="itemUdruzenjaReader" writer="itemUdruzenjaWriter" commit-interval="50">

</chunk> </tasklet>

</step> <step id="downloadExportIgeaPismoDatoteku" parent="simpleStep"

next="obrisiSveIzHokPridruzivanje"> <tasklet ref="downloadFileIgeaPismo"/> </step>

Spring Batch

Primjer iz prakse

<step id="obrisiSveIzHokPridruzivanje" parent="simpleStep" next="updateHokPridruzivanje">

<tasklet ref="obrisiSveHokPridruzivanje"/> </step> <step id="updateHokPridruzivanje" parent="simpleStep"

next="sendMailHok"> <tasklet>

<chunk reader="itemHokPridruzivanjeReader" writer="itemHokPridruzivanjeWriter" commit-interval="10000">

</chunk> </tasklet>

</step> <step id="sendMailHok" parent="simpleStep"> <tasklet ref="mailer"/> </step>

</job>

Spring Batch

Skidanje datoteke s web stranice

<bean id="downloadFileUdruzenja" class="org.spring…MethodInvokingTaskletAdapter">

<property name="targetObject">

<bean class="hr.igea....DownloadFile">

<property name="putanjaDatoteke" value="${putanjaXmlDatoteke}" />

<property name="webAdresaDatoteke" value="${webAdresaXmlDatoteke}" />

</bean>

</property>

<property name="targetMethod" value="download" />

</bean>

Spring Batch

Učitavanje XML datoteke

<bean id="itemUdruzenjaReader" class="org.springframework.batch.item.xml.StaxEventItemReader">

<property name="fragmentRootElementName" value="pokuo" />

<property name="resource" value="file:${putanjaXmlDatoteke}" />

<property name="unmarshaller" ref="udruzenjeMarshaller" />

</bean>

Spring Batch

Učitavanje XML datoteke (2)

<bean id="udruzenjeMarshaller" class="org.springframework….XStreamMarshaller">

<property name="aliases">

<util:map id="udruzenjaAliases">

<entry key="pokuo" value="hr.igea….Udruzenje" />

<entry key="sifra" value="java.lang.String" />

<entry key="pokuoloc" value="java.lang.String" />

...

</util:map>

</property>

<property name="fieldAliases">

<util:map id="fieldAliases">

<entry key="hr.igea….Udruzenje.nazivUdruzenja" value="naziv" />

<entry key="hr.igea….Udruzenje.pttBroj" value="ptt_broj" />

...

</util:map>

</property>

</bean>

Spring Batch

Zapisivanje podataka u bazu

<bean id="itemUdruzenjaWriter" class="hr.igea….UdruzenjaWriter">

public class UdruzenjaWriter implements ItemWriter<Udruzenje>{

@Autowired

private GenericDao dao;

public void write(List<? extends Udruzenje> udruzenja) throws Exception {

}

}

Spring Batch

Scheduliranje pokretanja zadatka

<bean id="updateUdruzenjaTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

<property name="jobDetail" ref="updateUdruzenjaDetail"/> <!-- izvedi svaki dan s pocetkom u 22h --> <property name="cronExpression" value="0 0 22 * * ?"/> </bean> <bean

class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="updateUdruzenjaTrigger"/> </list> </property> </bean>

Spring Batch

Zaključak

Spring Batch je jednostavan, ali moćan alat koji omogućava obradu velikih količina podataka

Pruža gotove, ponovno iskoristive funkcije za batch obrade

Prilagodljiv i skalabilan

Napredni servisi (optimiziranje, particioniranje)

Spring Batch

KRAJ!

HVALA NA PAŽNJI

Spring Batch