SpringBatch xml config helloworld repeat example

ScreenShot004In Java, the development of batch can be achieved with few solutions. Most applications use SpringBatch. This is the SpringBatch framework with its XML configuration that is used here. Another example with the configuration JavaConfig follow.

The focus of this tutorial is to develop a batch that will perform an “HelloWorld” task as many times as requested (value specify in argument content).

1. How it works?

JobExecution jobExecution = jobLauncherTestUtils.launchJob(
    new JobParametersBuilder().addLong("execution.times", 10L).toJobParameters()  // exec 10 times
);

2. Demo (console output)

...
sept. 14, 2013 5:10:17 PM org.springframework.batch.core.launch.support.SimpleJobLauncher$1 run
INFO: Job: [FlowJob: [name=helloWorldJob]] launched with the following parameters: [{execution.times=10}]
sept. 14, 2013 5:10:17 PM org.springframework.batch.core.job.SimpleStepHandler handleStep
INFO: Executing step: [helloWorldStep]
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
sept. 14, 2013 5:10:17 PM org.springframework.batch.core.launch.support.SimpleJobLauncher$1 run
INFO: Job: [FlowJob: [name=helloWorldJob]] completed with the following parameters: [{execution.times=10}] and the following status: [COMPLETED]

2. Implementation

HelloWorldReader.java

package com.dfremont.blog;

import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;

/**
 * reads as many times as there are executionTimes.
 */
public class HelloWorldReader implements ItemReader<Object> {

    private int executionTimes;

    public void setExecutionTimes(String newValue) {
        executionTimes = Integer.valueOf(newValue);
    }

    public Object read() throws Exception, UnexpectedInputException,
            ParseException {
        Object o = null;
        if (executionTimes > 0) {
            executionTimes--;
            o = new Object();
        }
        return o;
    }
}

HelloWorldWriter.java

package com.dfremont.blog;

import java.util.List;
import org.springframework.batch.item.ItemWriter;

/**
 * Task to repeat (helloworld).
 */
public class HelloWorldWriter implements ItemWriter<Object> {

    public void write(List<? extends Object> arg0) throws Exception {
        System.out.println("Hello World!");
    }

}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/batch"
	xmlns:beans="http://www.springframework.org/schema/beans" 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-2.0.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.0.xsd">

	<beans:bean id="jobRepository"
		class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
		<beans:property name="transactionManager" ref="transactionManager" />
	</beans:bean>

	<beans:bean id="jobLauncher"
		class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
		<beans:property name="jobRepository" ref="jobRepository" />
	</beans:bean>

	<beans:bean id="transactionManager"
		class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
</beans:beans>

simpleJob.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/batch"
	xmlns:beans="http://www.springframework.org/schema/beans" 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-2.0.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.1.xsd">

	<beans:import resource="applicationContext.xml" />

	<job id="helloWorldJob" job-repository="jobRepository">
		<!-- Job validator -->
		<validator ref="helloWorldJobParametersValidator" />

		<step id="helloWorldStep">
			<tasklet>
				<chunk reader="helloWorldReader" writer="helloWorldWriter"
					commit-interval="0">
				</chunk>
			</tasklet>
		</step>
	</job>

	<beans:bean id="helloWorldJobParametersValidator"
		class="org.springframework.batch.core.job.DefaultJobParametersValidator">
		<beans:property name="requiredKeys" value="execution.times" />
	</beans:bean>

	<beans:bean name="helloWorldReader" class="com.dfremont.blog.HelloWorldReader"
		scope="step">
		<beans:property name="executionTimes"
			value="#{jobParameters['execution.times']}" />
	</beans:bean>

	<beans:bean name="helloWorldWriter" class="com.dfremont.blog.HelloWorldWriter">
	</beans:bean>

	<!-- To run the job from the command line type the following: mvn exec:java
		-Dexec.mainClass=org.springframework.batch.core.launch.support.CommandLineJobRunner
		-Dexec.args="simpleJob.xml helloWorldJob" -->
</beans:beans>

View source code and more tests

https://github.com/damienfremont/blog/tree/master/20130914-springbatch-xmlconfig

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s