Spring Batch – mo‡an alat za batch obrade -
Transcript of Spring Batch – mo‡an alat za batch obrade -
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