Upload
maknihamdi
View
4.806
Download
5
Tags:
Embed Size (px)
DESCRIPTION
SpringBatch framework pres
Citation preview
SpringBatch: une solution quasi-complète du batch
processing en JEE
Hamdi MakniCCJ Arrow
TechDays-Sep-2009
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
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);• }
Exemple sans SpringBatch
• (DEMO)
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
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
Exemple avec SpringBatch
• (DEMO)
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,…
Notions de base SpringBatch
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" />
JobLauncher
• <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository" /> </bean>
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)
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>
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.
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>
Chunk oriented tasklet
ItemReader
• Deux principaux types de reader: file reader, ou DB reader
• Exemple de itemReader:– FlatFileItemReader – JdbcCursorItemReader – JmsItemReader – JpaPagingItemReader – ItemReaderAdapter
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>
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>
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
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>
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>
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>
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>
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>
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
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>
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
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>
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
Features: Partitionning
• Partitionner les données et les traiter sur plusieurs étapes en parallèle
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
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/