Spring Batch
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • thanks
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
6,679
On Slideshare
6,648
From Embeds
31
Number of Embeds
4

Actions

Shares
Downloads
170
Comments
1
Likes
2

Embeds 31

http://www.slideshare.net 24
http://www.linkedin.com 4
http://wildfire.gigya.com 2
https://www.linkedin.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. SpringBatch: une solution quasi-complète du batch processing en JEE Hamdi Makni CCJ Arrow TechDays-Sep-2009
  • 2. 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
  • 3. 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(" ");
    • 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);
    • }
  • 4. Exemple sans SpringBatch
    • (DEMO)
  • 5. 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
  • 6. 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
  • 7. Exemple avec SpringBatch
    • (DEMO)
  • 8. 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,…
  • 9. Notions de base SpringBatch
  • 10. JobRepository
    • Référentiel (ou dépôt) de SpringBatch
    • Deux implémentations:
      • <batch:job-repository id= &quot;jobRepositoryMap&quot; />
      • <batch:job-repository id= &quot;jobRepository&quot; data-source= &quot;dataSource&quot; transaction-manager= &quot;transactionManager&quot; table-prefix= &quot;BATCH_&quot; isolation-level-for-create= &quot;SERIALIZABLE&quot; />
  • 11. JobLauncher
    • <bean id= &quot;jobLauncher&quot; class= &quot;org.springframework.batch.core.launch.support.SimpleJobLauncher&quot; > <property name= &quot;jobRepository&quot; ref= &quot;jobRepository&quot; /> </bean>
  • 12. 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)
  • 13. Job
    • <batch:job id= &quot;accountFilterToClientsJob&quot;
    • job-repository= &quot;jobRepository&quot; >
    • <batch:step id= &quot;accountFilterToClientsStep&quot; >
    • <batch:tasklet>
    • <batch:chunk commit-interval= &quot;100&quot;
    • reader= &quot;accountFilterToClientsReader&quot; writer= &quot;accountFilterToClientsWriter&quot;
    • processor= &quot;accountFilterToClientsProcessor&quot; >
    • </batch:chunk>
    • </batch:tasklet>
    • </batch:step>
    • </batch:job>
  • 14. 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.
  • 15. Simple tasklet
    • <batch:step id= &quot;initBatchStagingStep&quot; >
    • <batch:tasklet job-repository= &quot;jobRepository&quot;
    • transaction-manager= &quot;jpaTransactionManager&quot; ref= &quot;initBatchStagingTasklet&quot; >
    • </batch:tasklet>
    • </batch:step>
    • <bean id= &quot;initBatchStagingTasklet&quot; class= « coco.batch.springbatch.tasklet.JdbcTasklet&quot; >
    • <property name= &quot;dataSource&quot; ref= &quot;dataSource&quot; />
    • <property name= &quot;sqlRequest&quot; value= &quot;update batch_staging set job_id = ? &quot; />
    • </bean>
  • 16. Chunk oriented tasklet
  • 17. ItemReader
    • Deux principaux types de reader: file reader, ou DB reader
    • Exemple de itemReader:
      • FlatFileItemReader
      • JdbcCursorItemReader
      • JmsItemReader
      • JpaPagingItemReader
      • ItemReaderAdapter
  • 18. Flat File Item Reader
    • <bean id= &quot;accountFilterToClientsReader&quot; class= &quot;org.springframework.batch.item.file.FlatFileItemReader&quot; >
    • <property name= &quot;resource&quot; >
    • <bean class= &quot;org.springframework.core.io.FileSystemResource&quot; >
    • <constructor-arg type= &quot;java.lang.String« value= &quot;${file.thaler.accountsfilter.in}&quot; />
    • </bean>
    • </property>
    • <property name= &quot;lineMapper&quot; >
    • <bean class= &quot;org.springframework.batch.item.file.mapping.DefaultLineMapper&quot; >
    • <property name= &quot;lineTokenizer&quot; >
    • <bean class= &quot;org.springframework.batch.item.file.transform.DelimitedLineTokenizer&quot; >
    • <property name= &quot;delimiter&quot; value= &quot;;&quot; />
    • <property name= &quot;names&quot; value= &quot;accNumber,accType&quot; ></property>
    • </bean>
    • </property>
    • <property name= &quot;fieldSetMapper&quot; >
    • <bean class= &quot;org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper&quot; >
    • <property name= &quot;prototypeBeanName&quot; value= &quot;accountsFilter&quot; />
    • </bean>
    • </property>
    • </bean>
    • </property>
    • </bean>
  • 19. DataBase Reader
    • <bean id= &quot;spFundAccountItemReader&quot;
    • class= &quot;org.springframework.batch.item.database.JdbcCursorItemReader&quot; >
    • <property name= &quot;dataSource&quot; ref= &quot;${dataSource}&quot; />
    • <property name= &quot;sql&quot; value= &quot; select cl1 from tab2&quot; />
    • <property name= &quot;rowMapper&quot; >
    • <bean class= &quot;coco.project.MyRowMapper&quot; />
    • </property>
    • </bean>
  • 20. 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
  • 21. Flat File Item Writer
    • <bean id= &quot;contratBaseItemWriter&quot; class= &quot;org.springframework.batch.item.file.FlatFileItemWriter&quot; >
    • <property name= &quot;headerCallback&quot; ref= &quot;contratBaseHeaderCallback&quot; />
    • <property name= &quot;footerCallback&quot; ref= &quot;contratBaseFooterCallback&quot; />
    • <property name= &quot;resource&quot; ref= &quot;contratBaseFileOutputLocator&quot; />
    • <property name= &quot;lineAggregator&quot; >
    • <bean
    • class= &quot;org.springframework.batch.item.file.transform.DelimitedLineAggregator&quot; >
    • <property name= &quot;delimiter&quot; value= &quot;;&quot; />
    • <property name= &quot;fieldExtractor&quot; >
    • <bean class= &quot;org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor&quot; >
    • <property name= &quot;names&quot; value= &quot;recordType,name1,name2&quot; />
    • </bean>
    • </property>
    • </bean>
    • </property>
    • </bean>
  • 22. Data Base Writer
    • <bean id= &quot;accountFilterToClientsWriter&quot;
    • class= &quot;org.springframework.batch.item.database.JdbcBatchItemWriter&quot; >
    • <property name= &quot;dataSource&quot; ref= &quot;dataSource&quot; />
    • <property name= &quot;sql&quot;
    • value= &quot;insert into cl_accounts_filter (ACC_NUMBER, ACC_TYPE, B2B , MAJ_DT_DATECRE, MAJ_DT_DATEMAJ)
    • values (:accNumber, :accType, :b2b, :majDtDateCre, :majDtDatemaj)&quot; />
    • <property name= &quot;itemSqlParameterSourceProvider&quot; >
    • <bean
    • class= &quot;org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider&quot; />
    • </property>
    • </bean>
  • 23. Item Writer Adapter
    • Délègue l’écriture à un service business: réutiliser un bean business
      • <bean id= &quot;ingClientItemWriter&quot;
      • class= &quot;org.springframework.batch.item.adapter.ItemWriterAdapter&quot; >
      • <property name= &quot;targetObject&quot; ref= &quot; simpleService&quot; />
      • <property name= &quot; targetMethod &quot; value= &quot;saveObject&quot; />
      • </bean>
  • 24. Features: skip, rollback, no-rollback, restart
    • <batch:step id= &quot;stagingObjectClientStep&quot; >
      • <batch:tasklet job-repository= &quot;jobRepository&quot; transaction-manager= &quot;jpaTransactionManager&quot; >
        • <batch:chunk
          • reader= &quot;clientStagingFileItemReader&quot;
          • writer= &quot;stagingObjectClientWriter&quot;
          • commit-interval= &quot;100&quot;
          • skip-limit = &quot;100000&quot;
          • task-executor= &quot;taskExecutor&quot;
          • retry-limit = &quot;2&quot; >
          • <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>
  • 25. 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=&quot;job&quot;>
      • <step id=&quot;stepA&quot; parent=&quot;s1&quot;>
        • <next on=&quot;*&quot; to=&quot;stepB&quot; />
        • <next on=&quot;FAILED&quot; to=&quot;stepC&quot; />
      • </step>
      • <step id=&quot;stepB&quot; parent=&quot;s2&quot; next=&quot;stepC&quot; />
      • <step id=&quot;stepC&quot; parent=&quot;s3&quot; />
    • </job>
  • 26. 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
  • 27. Features: multithreading
    • <bean id=&quot;taskExecutor&quot; class=&quot;org.springframework.core.task.SimpleAsyncTaskExecutor&quot; />
    • <batch:step id=&quot;stagingObjectClientStep&quot; >
      • <batch:tasklet job-repository=&quot;jobRepository&quot; transaction-manager=&quot;jpaTransactionManager&quot;>
        • <batch:chunk reader=&quot;ingClientStagingFileItemReader&quot; writer=&quot;stagingObjectClientWriter&quot; task-executor=&quot; taskExecutor &quot; >
        • </batch:chunk>
      • </batch:tasklet>
    • </batch:step>
  • 28. 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
  • 29. Features: Parallel step
    • <batch:job id= &quot;migrationCCIngToClientsJob&quot; parent= &quot;simpleJob&quot; >
      • <batch:step id= &quot;cleanBatchStagingStep_&quot; parent= &quot;cleanBatchStagingStep&quot; next= &quot;stagingFileStep&quot; />
      • <batch:split task-executor= &quot;taskExecutor&quot; id= &quot;stagingFileStep&quot; next= &quot;headerFooterClientStep_&quot; >
        • <batch:flow>
        • <batch:step id= &quot;stagingFileClientStep_&quot; parent= &quot;stagingFileClientStep&quot; />
        • </batch:flow>
        • <batch:flow>
        • <batch:step id= &quot;stagingFileContractStep_&quot; parent= &quot;stagingFileContractStep&quot; />
        • </batch:flow>
        • <batch:flow>
        • <batch:step id= &quot;stagingFileRelationStep_&quot; parent= &quot;stagingFileRelationStep&quot; />
        • </batch:flow>
      • </batch:split>
    • </batch:job>
  • 30. 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
  • 31. Features: Partitionning
    • Partitionner les données et les traiter sur plusieurs étapes en parallèle
  • 32. 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
  • 33. 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/