Introduzione
Nel post Primi Passi con Spring Batch abbiamo visto un semplice esempio di job eseguito utilizzando il framework Spring Batch. In particolare abbiamo visto che per il suo corretto funzionamento tale framework ha bisogno di un repository dove persistere le informazioni relative alla esecuzione dei vari batch. A tale scopo il framework utilizza il componete JobRepository
. Tecnicamente si tratta di una interfaccia che è implementata dalla classe del framework SimpleJobRepository
che offre i propri servizi per mezzo dei DAO che gli sono iniettati.
Per semplificare la creazione di tale componente il framework introduce la classe AbstractJobRepositoryFactoryBean
, ed in particolare vedremo due sue specializzazioni: MapJobRepositoryFactoryBean
e JobRepositoryFactoryBean.
MapJobRepositoryFactoryBean
Questa classe factory automatizza la creazione di un SimpleJobRepository
che utilizza DAO che implementano la persistenza in memoria. E’ quindi utilizzata principalmente per test e prototipizzazione rapida. Nell’utilizzare tale versione in-memory del SimpleJobRepository
deve tenersi conto che:
- essendo volatile quindi non consente la riesecuzione dei job tra differenti esecuzione della JVM;
- non è adatta all’utilizzo nel caso di multi-threaded job o partitioned step;
- non garantisce che due job con gli stessi parametri non siano avviati contemporaneamente;
- non richiede un transaction manager;
La porzione di XML seguente mostra come configurare un in-memory JobRepository
dove la proprietà transactionManager
è ovviamente opzionale.
1 2 3 4 5 |
<!-- stored job-meta in memory --> <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> <property name="transactionManager" ref="transactionManager" /> </bean> |
JobRepositoryFactoryBean
Questa classe factory automatizza la creazione di un SimpleJobRepository
che utilizza DAO che implementano la persistenza mediante JDBC e la connessione verso un database. E’ richiesta quindi la configurazione di un datasource e sono supportati i principali RDBMS.
La porzione di XML seguente mostra come configurare un reporitory di tale tipologia.
1 2 3 4 5 6 7 |
<!-- stored job-meta in database --> <bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="transactionManager" /> <property name="databaseType" value="mysql" /> </bean> |
In questo caso è quindi necessario configurare il datasource e il transaction manager nel modo seguente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd"> <!-- connect to MySQL database --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="" /> </bean> <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" /> <!-- create job-meta tables automatically --> <jdbc:initialize-database data-source="dataSource"> <jdbc:script location="org/springframework/batch/core/schema-drop-mysql.sql" /> <jdbc:script location="org/springframework/batch/core/schema-mysql.sql" /> </jdbc:initialize-database> </beans> |
Si noti che il framework offre anche i file SLQ per i drop e la creazione degli schema utilizzati. Accedendo alla cartella org/springframework/batch/core/
troverete, oltre ai file per MySQL, anche quelli per DB2, Derby, H2, HSQLDB, Oracle, PostGres, MS SqlServer e Sybase.
Una descrizione dettagliata dello schema utilizzato è disponibile nella documentazione ufficiale del framework, ed in particolare nell’Appendice B. Di seguito riportiamo per semplicità l’immagine delle tabelle e delle relazioni che intercorrono tra esse.