33
SpringBatch: une solution quasi-complète du batch processing en JEE Hamdi Makni CCJ Arrow TechDays-Sep-2009

Spring Batch

Embed Size (px)

DESCRIPTION

SpringBatch framework pres

Citation preview

Page 1: Spring Batch

SpringBatch: une solution quasi-complète du batch

processing en JEE

Hamdi MakniCCJ Arrow

TechDays-Sep-2009

Page 2: Spring Batch

Road map

• Exemple de batch sans SpringBatch• Problématique• C’est quoi spring batch?• Exemple de batch avec SpringBatch• Architecture• Notions de base• Features• Best pratices• références

Page 3: Spring Batch

Exemple sans SpringBatch• public void proceedBatch() {• FileCreator fileCreator = null;• try {• PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();• cfg.setLocation(new ClassPathResource("integration.properties"));• cfg.postProcessBeanFactory(_beanFactory);• jdbcBatchDao = (JdbcDaoBatchSupport) _beanFactory.getBean(getDaoBeanName());• fileCreator = new FileCreator("flatworm/INGMovementFlatWorm.xml",

"INGMOVEMENT"+ new Date().getTime());• fileCreator.open();• fileCreator.setRecordSeperator("\n");• List records = jdbcBatchDao.findRecords();• if (records != null) {• for (Iterator iterator = records.iterator(); iterator.hasNext();) {• INGMovement movement = (INGMovement)

iterator.next();• fileCreator.setBean("INGMovement", movement);• fileCreator.write("INGMovementRecord");• }• } else {• log.warn("No Data Found on DB to extract");• }• fileCreator.close();• } catch (IOException e) {• log.error(e.getMessage());• e.printStackTrace();• System.exit(0);• }• System.exit(0);• }

Page 4: Spring Batch

Exemple sans SpringBatch

• (DEMO)

Page 5: Spring Batch

Problématiques à résoudre

• Traitement par lot

• Performance

• Reprise d’erreurs

• Skip errors

• Gestion de transactions (ou pas?)

• Scénarios classiques:– file<->file– file<->db

Page 6: Spring Batch

SpringBatch

• Framework de batch processing en java– Répond aux besoins récurrents et classiques

du traitement de données par lot

• Fait partie de SpringPortfolio, donc basé sur Spring framework

• Implémentation DDD (Domain Driven Design)

• Solution quasi-complète• Écrit par SpringSource + Accenture

Page 7: Spring Batch

Exemple avec SpringBatch

• (DEMO)

Page 8: Spring Batch

Architecture

•Application: business spécifique, implémentations développeur

•Core: coeur de spring batch, job, step, jobrepository, joblauncher…

•Infrastructure: implémentations de base de ItemReader, ItemWriter,…

Page 9: Spring Batch

Notions de base SpringBatch

Page 10: Spring Batch

JobRepository

• Référentiel (ou dépôt) de SpringBatch• Deux implémentations:

– <batch:job-repository id="jobRepositoryMap"/>

– <batch:job-repository id="jobRepository" data-source="dataSource" transaction-manager="transactionManager" table-prefix="BATCH_" isolation-level-for-create="SERIALIZABLE" />

Page 11: Spring Batch

JobLauncher

• <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository" /> </bean>

Page 12: Spring Batch

Job/step/tasklet/chunk

• Un job est une suite d’étape, séquentielles, parallèles, synchrones, asynchrones …

• Une étape est un task, une tache, à exécuter

• Un task est une simple commande, ou bien une itération de traitements sur des lots de données (ou chunk)

Page 13: Spring Batch

Job

<batch:job id="accountFilterToClientsJob"job-repository="jobRepository"> <batch:step id="accountFilterToClientsStep"> <batch:tasklet> <batch:chunk commit-interval="100" reader="accountFilterToClientsReader"

writer="accountFilterToClientsWriter" processor="accountFilterToClientsProcessor"> </batch:chunk> </batch:tasklet> </batch:step></batch:job>

Page 14: Spring Batch

Step/task

• Deux types de step:– Simple tasklet: une simple tache à exécuter– Chunk (ou item V1) oriented tasklet:

traitement élément par élément, ou lot par lot.

Page 15: Spring Batch

Simple tasklet<batch:step id="initBatchStagingStep"> <batch:tasklet job-repository="jobRepository" transaction-manager="jpaTransactionManager"

ref="initBatchStagingTasklet" > </batch:tasklet></batch:step>

<bean id="initBatchStagingTasklet" class=« coco.batch.springbatch.tasklet.JdbcTasklet">

<property name="dataSource" ref="dataSource" /> <property name="sqlRequest" value="update batch_staging set

job_id = ? " /></bean>

Page 16: Spring Batch

Chunk oriented tasklet

Page 18: Spring Batch

Flat File Item Reader<bean id="accountFilterToClientsReader"

class="org.springframework.batch.item.file.FlatFileItemReader"> <property name="resource"> <bean class="org.springframework.core.io.FileSystemResource"> <constructor-arg type="java.lang.String« value="${file.thaler.accountsfilter.in}" /> </bean> </property> <property name="lineMapper"> <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> <property name="lineTokenizer"> <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> <property name="delimiter" value=";" /> <property name="names" value="accNumber,accType"></property> </bean> </property> <property name="fieldSetMapper"> <bean

class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> <property name="prototypeBeanName" value="accountsFilter"/> </bean> </property> </bean> </property></bean>

Page 19: Spring Batch

DataBase Reader

<bean id="spFundAccountItemReader"class="org.springframework.batch.item.database.J

dbcCursorItemReader"> <property name="dataSource" ref="$

{dataSource}" /> <property name="sql" value=" select cl1 from

tab2"/> <property name="rowMapper"> <bean class="coco.project.MyRowMapper"/> </property></bean>

Page 20: Spring Batch

ItemWriter

• Comme pour les reader, les 2 types de writer les plus utilisés sont les File Writer et les DB Writer.

• Exemples d’implémentation de Writer:– FlatFileItemWriter – JdbcBatchItemWriter – ItemWriterAdapter – CompositeItemWriter – JmsItemWriter – HibernateItemWriter

Page 21: Spring Batch

Flat File Item Writer<bean id="contratBaseItemWriter"

class="org.springframework.batch.item.file.FlatFileItemWriter"> <property name="headerCallback" ref="contratBaseHeaderCallback" /> <property name="footerCallback" ref="contratBaseFooterCallback" /> <property name="resource" ref="contratBaseFileOutputLocator" /> <property name="lineAggregator"> <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"> <property name="delimiter" value=";" /> <property name="fieldExtractor"> <bean

class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> <property name="names" value="recordType,name1,name2" /> </bean> </property> </bean> </property></bean>

Page 22: Spring Batch

Data Base Writer<bean id="accountFilterToClientsWriter"class="org.springframework.batch.item.database.JdbcBatchItemWriter"

> <property name="dataSource" ref="dataSource" /> <property name="sql" value="insert into cl_accounts_filter (ACC_NUMBER, ACC_TYPE,

B2B , MAJ_DT_DATECRE, MAJ_DT_DATEMAJ) values

(:accNumber, :accType, :b2b, :majDtDateCre, :majDtDatemaj)" /> <property name="itemSqlParameterSourceProvider"> <beanclass="org.springframework.batch.item.database.BeanPropertyItemSql

ParameterSourceProvider" /> </property></bean>

Page 23: Spring Batch

Item Writer Adapter

• Délègue l’écriture à un service business: réutiliser un bean business<bean id="ingClientItemWriter"class="org.springframework.batch.item.adapter.

ItemWriterAdapter"><property name="targetObject" ref= " simpleService" /><property name="targetMethod" value="saveObject" />

</bean>

Page 24: Spring Batch

Features: skip, rollback, no-rollback, restart

<batch:step id="stagingObjectClientStep" ><batch:tasklet job-repository="jobRepository" transaction-manager="jpaTransactionManager">

<batch:chunk reader="clientStagingFileItemReader"writer="stagingObjectClientWriter"commit-interval="100"skip-limit="100000"task-executor="taskExecutor"retry-limit="2"><batch:skippable-exception-classes>

coco.exception.BusinessException</batch:skippable-exception-classes><batch:fatal-exception-classes>

coco.exception.FatalException</batch:fatal-exception-classes><batch:retryable-exception-classes>

coco.exception.NetworkException</batch:retryable-exception-classes>

</batch:chunk><batch:no-rollback-exception-classes>

coco.exception.ValidationException</batch:no-rollback-exception-classes>

</batch:tasklet></batch:step>

Page 25: Spring Batch

Traitement conditionnel

• Contrôler le passage d’une étape à une autre• Le passage d’une étape à une autre dépend du

résultat de l’étape courante<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>

Page 26: Spring Batch

Features: multithreading

• Il suffit de mettre un TaskExecutor dans son Step pour que tout se lance en multithread

• Remarque: tout n’est pas en thread safe dans springBatch.– Il faut développer ses propres reader et

services synchronisés

Page 27: Spring Batch

Features: multithreading

<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />

<batch:step id="stagingObjectClientStep" ><batch:tasklet job-repository="jobRepository"

transaction-manager="jpaTransactionManager"><batch:chunk reader="ingClientStagingFileItemReader"

writer="stagingObjectClientWriter" task-executor="taskExecutor" >

</batch:chunk>

</batch:tasklet></batch:step>

Page 28: Spring Batch

Features: Parallel step

• L’une des nouvelles fonctionnalités très utiles de SpringBatch2

• Permet de lancer plusieurs étapes en même temps, et non en séquentiel.

• Une nouvelle notion de Flow

Page 29: Spring Batch

Features: Parallel step<batch:job id="migrationCCIngToClientsJob" parent="simpleJob">

<batch:step id="cleanBatchStagingStep_" parent="cleanBatchStagingStep" next="stagingFileStep" />

<batch:split task-executor="taskExecutor" id="stagingFileStep" next="headerFooterClientStep_">

<batch:flow><batch:step id="stagingFileClientStep_" parent="stagingFileClientStep"/>

</batch:flow><batch:flow>

<batch:step id="stagingFileContractStep_" parent="stagingFileContractStep" />

</batch:flow><batch:flow>

<batch:step id="stagingFileRelationStep_" parent="stagingFileRelationStep" />

</batch:flow></batch:split>

</batch:job>

Page 30: Spring Batch

Remote processing

• Utilisé si la partie traitement est plus coûteuse que la lecture

• Permet de traiter les éléments sur plusieurs process distant

• Utilisation de JMS, de solutions de grid computing, de partage de mémoire

Page 31: Spring Batch

Features: Partitionning

• Partitionner les données et les traiter sur plusieurs étapes en parallèle

Page 32: Spring Batch

Best pratices

• Paging

• Staging file

• Lecture moins coûteuse que le traitement

• Parallel processing

• Éviter les caches à longues durée de vie

• Splitter les gros fichiers

Page 33: Spring Batch

Références

• http://static.springsource.org/spring-batch/reference/html-single/index.html

• http://www.cafebabe.me/2008/05/spring-batch-hello-world-1.html

• http://static.springsource.org/spring-batch/

• http://blog.octo.com/spring-batch-par-quel-bout-le-prendre/