Primi Passi con Spring Batch

Spring Batch è un framework, rilasciato da Spring, finalizzato alla implementazione di applicazioni batch per l’elaborazione di grandi volumi di dati, senza alcuna interazione con l’utente. La figura seguente mostra la struttura di una tipica applicazione batch.

batch processing pattern

Le principali caratteristiche offerte dal framework sono:

  • Supporto a sorgenti di differente tipo: database, flat file (xml, csv, etc.), code JMS, JPA, MongoDB, Neo4J, etc;
  • Gestione automatica dei retry e failure;
  • Utilizzo di un linguaggio per la definizione dei job;
  • Tracciamento della stato di esecuzione dei batch attivi e completati e generazione di statistiche;
  • Supporto a differenti modalità di avvio dei job: script; http, message, etc;
  • Supporto all’esecuzione di job concorrenti;
  • Servizi di logging, gestione delle risorse, skip e riavvio delle esecuzioni;
  • Scomposizione di grandi quantità di dati e processamento parallelo.

Si noti che Spring Batch non è un framework di schedulazione, ma lavorapuò essere integrato con tali framework, ad esempio con Quartz.

Componenti

La figura seguente mostra le componenti che caratterizzano Spring Batch e le relazioni tra le stesse. Nel seguito sono brevemente descritte.

spring-batch-model

Il JobLauncher è la componente responsabile dello start dei job. Ad ogni richiesta di avvio verifica nel JobRepository che il job non sia stato già eseguito e la validità dei parametri. Il JobRepository è responsabile quindi della conservazione delle informazioni di esecuzione attraverso un repository che può essere in memory o su DB dedicato.

Job è ovviamente la descrizione del processo che deve essere eseguito, mentre la JobInstance è la sua istanziazione sui JobParameter, ovvero sui parametri utilizzati dal job. La singola esecuzione del job è rappresentata da una JobExecution che contiene informazioni sull’esecuzione quali: stato, data ed ora di avvio e conclusione, eventuale eccezione, etc. Poiché una JobInstance può essere eseguita più volte ad essa potranno essere associate più JobExecution.job component

Il Job è suddiviso in una sequenza di Step. Ogni step consiste di tre attività: data reading, processing e data writing. Spring Batch fornisce specifiche interfacce per l’implementazione di tali attività, rispettivamente ItemReader, ItemProcessor e ItemWriter.

La singola esecuzione di uno step è rappresentata da un oggetto StepExecution che contiene tutte le informazioni di esecuzione: stato, data ed ora di avvio e completamento, numero di letture, scritture e commit, etc.

Spring Batch utilizza un meccanismo di elaborazione a chunk (blocchi). Questo implica che i dati vengono letti e processati a blocchi utilizzando l’ItemReader e l’ItemProcessor, quindi vengono aggregati e solamente quando è raggiunto l’intervallo di commit richiesto, l’intero blocco è passato all’ItemWriter e la transazione è committata.

chunk-oriented-processing

Il Progetto di Esempio

Per la realizzazione del nostro primo progetto utilizziamo Maven generando un progetto base senza selezionare alcun archetype. Quindi definiamo le proprietà del progetto come segue:

  • groupId: it.javaboss
  • artifactId: spring-batch

Apriamo quindi il pom.xml ed inseriamo le dipendenze necessaria a spring bath. L’aspetto del ile sarà:

Come primo esempio consideriamo un job che si compone di un solo step. Come detto precedentemente lo step sarà caratterizzato dalle attività di read, process e write specificate attraverso tre bean. La definizione del batch è fatta mediante file XML. Nel nostro esempio il file job-hello-world.xml sarà:

Nell’XML si riconoscono facilmente i tag utilizzati per specificare il job, lo step ed il chunk. Nel file sono inoltre definiti i bean associati chunk che riportiamo nel seguito.

  • HelloItemReader restituisce nomi propri di persone leggendoli da un array di costanti:
  • HelloItemProcessor aggiunge la stringa “Hello” al nome passato come parametro.
  • HelloItemWriter stampa sullo standard output la stringa creata da HelloItemProcessor.

Per completare il progetto abbiamo bisogno di un file XML di contesto in cui sono definiti i bean per JobRepository e JobLauncher. In particolare il repository è conservato in memoria quindi ad ogni riavvio le informazioni di esecuzione sono perse.

Concludiamo con l’implementare il main() che avvia il job utilizzando il bean jobLauncher.

Esecuzione del Progetto

Una volta avviato il main() l’output generato da tutte le System.out, ripulito di eventuali messaggi di Spring, è:

Come ci aspettavamo avendo indicato il commit-interval a 3 ed dovendo elaborare 5 nomi (item), si ha:

  1. un primo chunk in cui vengono letti 3 nomi (dal reader) che sono poi passati in sequenza al processor. I tre nomi elaborati sono quindi inviati al writer che li stampa;
  2. un secondo chunk dove sono letti i restanti due nomi e, come si vede al terzo tentativo il reader restituisce NULL, di fatto bloccando il batch. I due nomi restanti sono processati e stampati come da specifica.

Codie Sorgente

Il codice sorgente del progetto è disponibile qui spring-batch.

How useful was this post?

Click on a star to rate it!

Average rating 4.9 / 5. Vote count: 11

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!