Spring Batch
 ou le Batch avec la classe !


                           Jean-Philippe Briend
                      jean-philippe.briend@infin-it.fr
                                 twitter.com/jpbriend
Papa, c’est quoi un Batch ?

    Wikipedia : http://en.wikipedia.org/wiki/Batch_processing
•   Batch jobs are set up so they can be run to completion without manual intervention, so
    all input data is preselected through scripts or command-line parameters. This is in
    contrast to "online" or interactive programs which prompt the user for such input. A
    program takes a set of data files as input, processes the data, and
    produces a set of output data files. This operating environment is termed as
    "batch processing" because the input data are collected into batches of files and are
    processed in batches by the program.
Les batchs en Java : Aujourd’hui

•   C’est vieux !

•   C’est moche !

•   C’est multi-techno !

•   C’est mal écrit !


                    On aime pas ça !
Les batchs en Java : Demain

•   Organiser !

•   Unifier !

•   Simplifier !

•   Se concentrer sur le métier !


                  On aime ça !
Spring, pourquoi c’est sympa ?


•   La tuyauterie par configuration XML

•   On commence à être à l’aise dessus (sinon
    changez d’employeur !)
I had a dream ...
•   Imaginez qu’un Batch soit des petites cases bien
    agencées ...

•   Imaginez qu’on puisse agencer ces cases par de
    la configuration XML ...

•   Imaginez qu’on puisse facilement configurer son
    Batch ...
Here comes the Sun ...



 Spring Batch
Spring Batch n’est pas ...
•   un ordonnanceur : non non non non, Spring
    Batch ne planifie pas de batchs !

•   une nouvelle techno : on ne remplace pas du PL/
    SQL s’il ne le faut pas. On reste pragmatique !

•   un truc brainless !
Spring Batch ...
•   va vous obliger à vous décrasser les neurones

•   va vous faire passer pour un mec carré qui fait des
    choses performantes (selon la capacité intellectuelle de
    chacun, hein !)

•   va vous faire réutiliser (on n’y croyait plus)

•   va vous faire aller voir les MOAs (oui oui oui)

•   va vous faire dessiner (et ouais !)
Compose ton framework ...
    Composons notre framework à la carte :

•   petites boites pour représenter des traitements métiers
    différents

•   agencer ces traitements via un diagramme d’activité

•   Springifier le tout
Step
•   Définition : “A Step is a domain object that encapsulates
    an independent, sequential phase of a batch job”

•   Se compose de :
                                   ItemReader


              Step               ItemProcessor

                                   ItemWriter
Job


•   Définition : “A Job is an entity that encapsulates an entire
    batch process.”

•   Se compose d’un ensemble de Steps agencées en un
    diagramme d’activité
Step : Tasklet
•   Step la plus simple : Interface avec une seule méthode
    execute

•   Appelée de façon répétitive jusqu’à ce qu’elle renvoit
    RepeatStatus.FINISHED ou une Exception

•   Transaction unique

                      <step id="step1">
                          <tasklet ref="myTasklet"/>
                      </step>
Step : Chunk




<job id="sampleJob" job-repository="jobRepository">
    <step id="step1">
        <tasklet transaction-manager="transactionManager">
            <chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>
        <tasklet>
    </step>
</job>
Flow


       Split
Résumé
Job : ensemble cohérent de traitements de données
   Un Job est composé de Steps
Step : traitement unitaire de données
   Une Step est composée de :
        un Reader
        un ou plusieurs Processors
        un Writer
ItemReader
•   Rôle : lire des données quelquepart

    •   Fichier

    •   XML

    •   Base de Données

•   Retourne un Item ou null s’il n’y en a plus

•   Plein de Readers existant
            public interface ItemReader<T> {
                T read() throws Exception, UnexpectedInputException, ParseException;
            }
ItemWriter
•   Identique à l’ItemReader mais avec l’opération inverse

    •   Fichier

    •   XML

    •   Base de Données

•   Plein de Writers existant

            public interface ItemWriter<T> {
                void write(List<? extends T> items) throws Exception;
            }
ItemProcessor
•   Très simple : prends un objet en entrée et en retourne
    un autre en sortie

•   Sert à implémenter la logique métier

•   Chainable

        public interface ItemProcessor<I, O> {
            O process(I item) throws Exception;
        }
MultiThreading


•   Multi-threaded Step

•   Parallel Steps

•   Remote Chunking

•   Partitioning Step
Multi-threaded Step
•   Utilisation des TaskExecutors de Spring




           <step id="loading">
               <tasklet task-executor="taskExecutor">...</tasklet>
           </step>
Parallel Steps
•   Utilisation des TaskExecutors de Spring

•   Utilisation du flow Split

         <job id="job1">
             <split id="split1" task-executor="taskExecutor" next="step4">
                 <flow>
                      <step id="step1" next="step2" />
                      <step id="step2" />
                 </flow>
                 <flow>
                      <step id="step3" />
                 </flow>
             </split>
             <step id="step4" />
         </job>

         <beans:bean id="taskExecutor"
         class="org.spr...SimpleAsyncTaskExecutor"/>
Remote Chunking
Partitioning Step
Demo

Spring Batch 17-05-2011

  • 1.
    Spring Batch oule Batch avec la classe ! Jean-Philippe Briend jean-philippe.briend@infin-it.fr twitter.com/jpbriend
  • 2.
    Papa, c’est quoiun Batch ? Wikipedia : http://en.wikipedia.org/wiki/Batch_processing • Batch jobs are set up so they can be run to completion without manual intervention, so all input data is preselected through scripts or command-line parameters. This is in contrast to "online" or interactive programs which prompt the user for such input. A program takes a set of data files as input, processes the data, and produces a set of output data files. This operating environment is termed as "batch processing" because the input data are collected into batches of files and are processed in batches by the program.
  • 3.
    Les batchs enJava : Aujourd’hui • C’est vieux ! • C’est moche ! • C’est multi-techno ! • C’est mal écrit ! On aime pas ça !
  • 4.
    Les batchs enJava : Demain • Organiser ! • Unifier ! • Simplifier ! • Se concentrer sur le métier ! On aime ça !
  • 5.
    Spring, pourquoi c’estsympa ? • La tuyauterie par configuration XML • On commence à être à l’aise dessus (sinon changez d’employeur !)
  • 6.
    I had adream ... • Imaginez qu’un Batch soit des petites cases bien agencées ... • Imaginez qu’on puisse agencer ces cases par de la configuration XML ... • Imaginez qu’on puisse facilement configurer son Batch ...
  • 7.
    Here comes theSun ... Spring Batch
  • 8.
    Spring Batch n’estpas ... • un ordonnanceur : non non non non, Spring Batch ne planifie pas de batchs ! • une nouvelle techno : on ne remplace pas du PL/ SQL s’il ne le faut pas. On reste pragmatique ! • un truc brainless !
  • 9.
    Spring Batch ... • va vous obliger à vous décrasser les neurones • va vous faire passer pour un mec carré qui fait des choses performantes (selon la capacité intellectuelle de chacun, hein !) • va vous faire réutiliser (on n’y croyait plus) • va vous faire aller voir les MOAs (oui oui oui) • va vous faire dessiner (et ouais !)
  • 10.
    Compose ton framework... Composons notre framework à la carte : • petites boites pour représenter des traitements métiers différents • agencer ces traitements via un diagramme d’activité • Springifier le tout
  • 11.
    Step • Définition : “A Step is a domain object that encapsulates an independent, sequential phase of a batch job” • Se compose de : ItemReader Step ItemProcessor ItemWriter
  • 12.
    Job • Définition : “A Job is an entity that encapsulates an entire batch process.” • Se compose d’un ensemble de Steps agencées en un diagramme d’activité
  • 14.
    Step : Tasklet • Step la plus simple : Interface avec une seule méthode execute • Appelée de façon répétitive jusqu’à ce qu’elle renvoit RepeatStatus.FINISHED ou une Exception • Transaction unique <step id="step1"> <tasklet ref="myTasklet"/> </step>
  • 15.
    Step : Chunk <jobid="sampleJob" job-repository="jobRepository"> <step id="step1"> <tasklet transaction-manager="transactionManager"> <chunk reader="itemReader" writer="itemWriter" commit-interval="10"/> <tasklet> </step> </job>
  • 16.
    Flow Split
  • 17.
    Résumé Job : ensemblecohérent de traitements de données Un Job est composé de Steps Step : traitement unitaire de données Une Step est composée de : un Reader un ou plusieurs Processors un Writer
  • 18.
    ItemReader • Rôle : lire des données quelquepart • Fichier • XML • Base de Données • Retourne un Item ou null s’il n’y en a plus • Plein de Readers existant public interface ItemReader<T> { T read() throws Exception, UnexpectedInputException, ParseException; }
  • 19.
    ItemWriter • Identique à l’ItemReader mais avec l’opération inverse • Fichier • XML • Base de Données • Plein de Writers existant public interface ItemWriter<T> { void write(List<? extends T> items) throws Exception; }
  • 20.
    ItemProcessor • Très simple : prends un objet en entrée et en retourne un autre en sortie • Sert à implémenter la logique métier • Chainable public interface ItemProcessor<I, O> { O process(I item) throws Exception; }
  • 21.
    MultiThreading • Multi-threaded Step • Parallel Steps • Remote Chunking • Partitioning Step
  • 22.
    Multi-threaded Step • Utilisation des TaskExecutors de Spring <step id="loading"> <tasklet task-executor="taskExecutor">...</tasklet> </step>
  • 23.
    Parallel Steps • Utilisation des TaskExecutors de Spring • Utilisation du flow Split <job id="job1"> <split id="split1" task-executor="taskExecutor" next="step4"> <flow> <step id="step1" next="step2" /> <step id="step2" /> </flow> <flow> <step id="step3" /> </flow> </split> <step id="step4" /> </job> <beans:bean id="taskExecutor" class="org.spr...SimpleAsyncTaskExecutor"/>
  • 24.
  • 25.
  • 26.