TaskletStep Oriented Processing in Spring Batch

Many enterprise applications require batch processing to process billions of transactions every day. These big transaction sets have to be processed without performance problems. Spring Batch is a lightweight and robust batch framework to process these big data sets.

Spring Batch offers ‘TaskletStep Oriented’ and ‘Chunk Oriented’ processing style. In this article, TaskletStep Oriented Processing Model is explained.
 
 
 
 
 
Let us investigate fundamental Spring Batch components :

Job :

An entity that encapsulates an entire batch process. Step and Tasklets are defined under a Job

Step :

A domain object that encapsulates an independent, sequential phase of a batch job.

JobInstance :

Batch domain object representing a uniquely identifiable job run – it’s identity is given by the pair Job and JobParameters.

JobParameters :

Value object representing runtime parameters to a batch job.

JobExecution :

A JobExecution refers to the technical concept of a single attempt to run a Job. An execution may end in failure or success, but the JobInstance corresponding to a given execution will not be considered complete unless the execution completes successfully.

JobRepository :

An interface which responsible for persistence of batch meta-data entities. In the following sample, an in-memory repository is used via MapJobRepositoryFactoryBean.

JobLauncher :

An interface exposing run method, which launches and controls the defined jobs.

TaskLet :

An interface exposing execute method, which will be a called repeatedly until it either returns RepeatStatus.FINISHED or throws an exception to signal a failure. It is used when both readers and writers are not required as the following sample.

Let us take a look how to develop Tasklet-Step Oriented Processing Model.

Used Technologies :

  • JDK 1.7.0_09
  • Spring 3.1.3
  • Spring Batch 2.1.9
  • Maven 3.0.4

STEP 1 : CREATE MAVEN PROJECT

A maven project is created as below. (It can be created by using Maven or IDE Plug-in).

STEP 2 : LIBRARIES

Firstly, dependencies are added to Maven’ s pom.xml.

    <properties>
		<spring.version>3.1.3.RELEASE</spring.version>
		<spring-batch.version>2.1.9.RELEASE</spring-batch.version>
    </properties>

	<dependencies>
		<!-- Spring Dependencies -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>    

		<!-- Spring Batch Dependency -->
		<dependency>
			<groupId>org.springframework.batch</groupId>
			<artifactId>spring-batch-core</artifactId>
			<version>${spring-batch.version}</version>
		</dependency>

		<!-- Log4j library -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.16</version>
		</dependency>

	</dependencies>

maven-compiler-plugin(Maven Plugin) is used to compile the project with JDK 1.7

	<plugin>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-compiler-plugin</artifactId>
		<version>3.0</version>
		<configuration>
		  <source>1.7</source>
		  <target>1.7</target>
		</configuration>
	</plugin>

The following Maven plugin can be used to create runnable-jar,

	<plugin>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-shade-plugin</artifactId>
		<version>2.0</version>

		<executions>
			<execution>
				<phase>package</phase>
				<goals>
					<goal>shade</goal>
				</goals>
				<configuration>
					<configuration>
			          <source>1.7</source>
			          <target>1.7</target>
			        </configuration>
					<transformers>
						<transformer
						implementation=
                              'org.apache.maven.plugins.shade.resource.ManifestResourceTransformer'>
							<mainClass>com.onlinetechvision.exe.Application</mainClass>
						</transformer>
						<transformer
						implementation=
                                     'org.apache.maven.plugins.shade.resource.AppendingTransformer'>
							<resource>META-INF/spring.handlers</resource>
						</transformer>
						<transformer
						implementation=
                                     'org.apache.maven.plugins.shade.resource.AppendingTransformer'>
							<resource>META-INF/spring.schemas</resource>
						</transformer>
					</transformers>
				</configuration>
			</execution>
		</executions>
	</plugin>

STEP 3 : CREATE SuccessfulStepTasklet TASKLET

SuccessfulStepTasklet is created by implementing Tasklet Interface. It illustrates business logic in successful step.

package com.onlinetechvision.tasklet;

import org.apache.log4j.Logger;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;

/**
 * SuccessfulStepTasklet Class illustrates a successful job
 *
 * @author onlinetechvision.com
 * @since 27 Nov 2012
 * @version 1.0.0
 *
 */
public class SuccessfulStepTasklet implements Tasklet {

	private static final Logger logger = Logger.getLogger(SuccessfulStepTasklet.class);

    private String taskResult;

    /**
     * Executes SuccessfulStepTasklet
     *
     * @param StepContribution stepContribution
     * @param ChunkContext chunkContext
     * @return RepeatStatus
     * @throws Exception
     *
     */
    @Override
	public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
    	logger.debug('Task Result : ' + getTaskResult());
    	return RepeatStatus.FINISHED;
	}

	public String getTaskResult() {
		return taskResult;
	}

	public void setTaskResult(String taskResult) {
		this.taskResult = taskResult;
	} 

}

STEP 4 : CREATE FailedStepTasklet TASKLET

FailedStepTasklet is created by implementing Tasklet Interface. It illustrates business logic in failed step.

package com.onlinetechvision.tasklet;

import org.apache.log4j.Logger;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;

/**
 * FailedStepTasklet Class illustrates a failed job.
 *
 * @author onlinetechvision.com
 * @since 27 Nov 2012
 * @version 1.0.0
 *
 */
public class FailedStepTasklet implements Tasklet {

	private static final Logger logger = Logger.getLogger(FailedStepTasklet.class);

    private String taskResult;

    /**
     * Executes FailedStepTasklet
     *
     * @param StepContribution stepContribution
     * @param ChunkContext chunkContext
     * @return RepeatStatus
     * @throws Exception
     *
     */
    @Override
	public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
    	logger.debug('Task Result : ' + getTaskResult());
    	throw new Exception('Error occurred!');
	}

	public String getTaskResult() {
		return taskResult;
	}

	public void setTaskResult(String taskResult) {
		this.taskResult = taskResult;
	} 

}

STEP 5 : CREATE BatchProcessStarter CLASS

BatchProcessStarter Class is created to launch the jobs. Also, it logs their execution results. A Completed Job Instance can not be restarted with the same parameter(s) because it already exists in job repository and JobInstanceAlreadyCompleteException is thrown with “A job instance already exists and is complete” description. It can be restarted with different parameter. In the following sample, different currentTime parameter is set in order to restart FirstJob.

package com.onlinetechvision.spring.batch;

import org.apache.log4j.Logger;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.JobRestartException;

/**
 * BatchProcessStarter Class launches the jobs and logs their execution results.
 *
 * @author onlinetechvision.com
 * @since 27 Nov 2012
 * @version 1.0.0
 *
 */
public class BatchProcessStarter {

	private static final Logger logger = Logger.getLogger(BatchProcessStarter.class);

	private Job firstJob;
	private Job secondJob;
	private Job thirdJob;
	private JobLauncher jobLauncher;
	private JobRepository jobRepository;

	/**
     * Starts the jobs and logs their execution results.
     *
     */
	public void start() {
		JobExecution jobExecution = null;
		JobParametersBuilder builder = new JobParametersBuilder();

		try {

			builder.addLong('currentTime', new Long(System.currentTimeMillis()));
			getJobLauncher().run(getFirstJob(), builder.toJobParameters());
			jobExecution = getJobRepository().getLastJobExecution(getFirstJob().getName(), builder.toJobParameters());
			logger.debug(jobExecution.toString());			

			getJobLauncher().run(getSecondJob(), builder.toJobParameters());
			jobExecution = getJobRepository().getLastJobExecution(getSecondJob().getName(), builder.toJobParameters());
			logger.debug(jobExecution.toString());

			getJobLauncher().run(getThirdJob(), builder.toJobParameters());
			jobExecution = getJobRepository().getLastJobExecution(getThirdJob().getName(), builder.toJobParameters());
			logger.debug(jobExecution.toString());

			builder.addLong('currentTime', new Long(System.currentTimeMillis()));
			getJobLauncher().run(getFirstJob(), builder.toJobParameters());
			jobExecution = getJobRepository().getLastJobExecution(getFirstJob().getName(), builder.toJobParameters());
			logger.debug(jobExecution.toString());

		} catch (JobExecutionAlreadyRunningException
					| JobRestartException
					| JobInstanceAlreadyCompleteException
					| JobParametersInvalidException e) {
			logger.error(e);
		}

	}	

	public Job getFirstJob() {
		return firstJob;
	}

	public void setFirstJob(Job firstJob) {
		this.firstJob = firstJob;
	}

	public Job getSecondJob() {
		return secondJob;
	}

	public void setSecondJob(Job secondJob) {
		this.secondJob = secondJob;
	}	

	public Job getThirdJob() {
		return thirdJob;
	}

	public void setThirdJob(Job thirdJob) {
		this.thirdJob = thirdJob;
	}

	public JobLauncher getJobLauncher() {
		return jobLauncher;
	}

	public void setJobLauncher(JobLauncher jobLauncher) {
		this.jobLauncher = jobLauncher;
	}

	public JobRepository getJobRepository() {
		return jobRepository;
	}

	public void setJobRepository(JobRepository jobRepository) {
		this.jobRepository = jobRepository;
	}	

}

STEP 6 : CREATE applicationContext.xml

Spring Configuration file, applicationContext.xml, is created. It covers Tasklets and BatchProcessStarter definitions.

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'
	xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
	xmlns:batch='http://www.springframework.org/schema/batch'
	xsi:schemaLocation='http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd


http://www.springframework.org/schema/batch


http://www.springframework.org/schema/batch/spring-batch-2.1.xsd'>

    <bean id='firstTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'>
    	<property name='taskResult'  value='First Task is executed...' />
    </bean>

    <bean id='secondTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'>
    	<property name='taskResult'  value='Second Task is executed...' />
    </bean>

    <bean id='thirdTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'>
    	<property name='taskResult'  value='Third Task is executed...' />
    </bean>

    <bean id='fourthTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'>
    	<property name='taskResult'  value='Fourth Task is executed...' />
    </bean>

    <bean id='fifthTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'>
    	<property name='taskResult'  value='Fifth Task is executed...' />
    </bean>

    <bean id='sixthTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'>
    	<property name='taskResult'  value='Sixth Task is executed...' />
    </bean>

     <bean id='seventhTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'>
    	<property name='taskResult'  value='Seventh Task is executed...' />
    </bean>

    <bean id='failedStepTasklet' class='com.onlinetechvision.tasklet.FailedStepTasklet'>
    	<property name='taskResult'  value='Error occurred!' />
    </bean>    

	<bean id='batchProcessStarter' class='com.onlinetechvision.spring.batch.BatchProcessStarter'>
		<property name='jobLauncher' ref='jobLauncher'/>
		<property name='jobRepository' ref='jobRepository'/>
		<property name='firstJob' ref='firstJob'/>
		<property name='secondJob' ref='secondJob'/>
		<property name='thirdJob' ref='thirdJob'/>
    </bean>    

</beans>

STEP 7 : CREATE jobContext.xml

Spring Configuration file, jobContext.xml, is created. Jobs’ flows are the following :

FirstJob’ s flow :

1) FirstStep is started.
2) After FirstStep is completed with COMPLETED status, SecondStep is started.
3) After SecondStep is completed with COMPLETED status, ThirdStep is started.
4) After ThirdStep is completed with COMPLETED status, FirstJob execution is completed with COMPLETED status.

SecondJob’ s flow :

1) FourthStep is started.
2) After FourthStep is completed with COMPLETED status, FifthStep is started.
3) After FifthStep is completed with COMPLETED status, SecondJob execution is completed with COMPLETED status.

ThirdJob’ s flow :

1) SixthStep is started.
2) After SixthStep is completed with COMPLETED status, SeventhStep is started.
3) After SeventhStep is completed with FAILED status, ThirdJob execution is completed FAILED status.

FirstJob’ s flow is same with the first execution.

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'
	xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
	xmlns:batch='http://www.springframework.org/schema/batch'
	xsi:schemaLocation='http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd


http://www.springframework.org/schema/batch


http://www.springframework.org/schema/batch/spring-batch-2.1.xsd'>

    <import resource='applicationContext.xml'/>

    <bean id='transactionManager' class='org.springframework.batch.support.transaction.ResourcelessTransactionManager'/>

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

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

     <bean id='taskletStep' class='org.springframework.batch.core.step.tasklet.TaskletStep'>
        <property name='jobRepository' ref='jobRepository'/>
        <property name='transactionManager' ref='transactionManager'/>
    </bean>

    <batch:job id='firstJob'>
	    <batch:step id='firstStep' next='secondStep'>
			<batch:tasklet ref='firstTasklet'/>
		</batch:step>
		<batch:step id='secondStep' next='thirdStep' >
			<batch:tasklet ref='secondTasklet'/>
		</batch:step>
		<batch:step id='thirdStep'>
			<batch:tasklet ref='thirdTasklet' />
		</batch:step>
	</batch:job>

	<batch:job id='secondJob'>
		<batch:step id='fourthStep'>
			<batch:tasklet ref='fourthTasklet' />
	        <batch:next on='*' to='fifthStep' />
	        <batch:next on='FAILED' to='failedStep' />
	    </batch:step>
	    <batch:step id='fifthStep'>
			<batch:tasklet ref='fifthTasklet' />
		</batch:step>
		<batch:step id='failedStep'>
			<batch:tasklet ref='failedStepTasklet' />
		</batch:step>
	</batch:job>

	<batch:job id='thirdJob'>
		<batch:step id='sixthStep'>
			<batch:tasklet ref='sixthTasklet' />
	        <batch:next on='*' to='seventhStep' />
	        <batch:next on='FAILED' to='eighthStep' />
	    </batch:step>
	    <batch:step id='seventhStep'>
			<batch:tasklet ref='failedStepTasklet' />
		</batch:step>
		<batch:step id='eighthStep'>
			<batch:tasklet ref='seventhTasklet' />
		</batch:step>
	</batch:job>

</beans>

STEP 8 : CREATE Application CLASS

Application Class is created to run the application.

package com.onlinetechvision.exe;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.onlinetechvision.spring.batch.BatchProcessStarter;

/**
 * Application Class starts the application.
 *
 * @author onlinetechvision.com
 * @since 27 Nov 2012
 * @version 1.0.0
 *
 */
public class Application {

	/**
     * Starts the application
     *
     * @param  String[] args
     *
     */
	public static void main(String[] args) {
		ApplicationContext appContext = new ClassPathXmlApplicationContext('jobContext.xml');
		BatchProcessStarter batchProcessStarter = (BatchProcessStarter)appContext.getBean('batchProcessStarter');
		batchProcessStarter.start();
	}

}

STEP 9 : BUILD PROJECT

After OTV_SpringBatch_TaskletStep_Oriented_Processing Project is built, OTV_SpringBatch_TaskletStep-0.0.1-SNAPSHOT.jar will be created.

STEP 10 : RUN PROJECT

After created OTV_SpringBatch_TaskletStep-0.0.1-SNAPSHOT.jar file is run, the following console output logs will be shown :

First Job’ s console output :

25.11.2012 21:29:19  INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [name=firstJob]] launched
with the following parameters: [{currentTime=1353878959462}]
25.11.2012 21:29:19 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id=0, version=0,
startTime=null, endTime=null, lastUpdated=Sun Nov 25 21:29:19 GMT 2012, status=STARTING, exitStatus=exitCode=UNKNOWN;
exitDescription=, job=[JobInstance: id=0, version=0, JobParameters=[{currentTime=1353878959462}], Job=[firstJob]]
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:135) - Resuming state=firstJob.firstStep with status=UNKNOWN
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.firstStep
25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [firstStep]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=1
25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : First Task is executed...
25.11.2012 21:29:20 DEBUG (AbstractStep.java:209) - Step execution success: id=1
25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=1, version=3,
name=firstStep, status=COMPLETED, exitStatus=COMPLETED,
readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.firstStep with status=COMPLETED

25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.secondStep
25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [secondStep]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=2
25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Second Task is executed...
25.11.2012 21:29:20 DEBUG (AbstractStep.java:209) - Step execution success: id=2
25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=2, version=3,
name=secondStep, status=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0,
writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.secondStep with status=COMPLETED
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.thirdStep

25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [thirdStep]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=3
25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Third Task is executed...
25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=3, version=3, name=thirdStep,
status=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0,
processSkipCount=0, commitCount=1, rollbackCount=0
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.thirdStep with status=COMPLETED
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.end3
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.end3 with status=COMPLETED
25.11.2012 21:29:20 DEBUG (AbstractJob.java:294) - Job execution complete: JobExecution: id=0, version=1, startTime=Sun Nov 25 21:29:19 GMT 2012,
endTime=null, lastUpdated=Sun Nov 25 21:29:19 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=,
job=[JobInstance: id=0, version=0, JobParameters=[{currentTime=1353878959462}], Job=[firstJob]]
25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:121) - Job: [FlowJob: [name=firstJob]] completed with the following
parameters: [{currentTime=1353878959462}] and the following status: [COMPLETED]
25.11.2012 21:29:20 DEBUG (BatchProcessStarter.java:44) - JobExecution: id=0, version=2, startTime=Sun Nov 25 21:29:19 GMT 2012,
endTime=Sun Nov 25 21:29:20 GMT 2012, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=,
job=[JobInstance: id=0, version=0, JobParameters=[{currentTime=1353878959462}], Job=[firstJob]]

Second Job’ s console output :

25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [name=secondJob]] launched with the following parameters: [{currentTime=1353878959462}]
25.11.2012 21:29:20 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id=1, version=0, startTime=null, endTime=null,
lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=STARTING, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=1, version=0,
JobParameters=[{currentTime=1353878959462}], Job=[secondJob]]
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:135) - Resuming state=secondJob.fourthStep with status=UNKNOWN
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=secondJob.fourthStep
25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [fourthStep]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=4
25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Fourth Task is executed...
25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=4, version=3, name=fourthStep, status=COMPLETED,
exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=secondJob.fourthStep with status=COMPLETED

25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=secondJob.fifthStep
25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [fifthStep]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=5
25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Fifth Task is executed...
25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=5, version=3, name=fifthStep, status=COMPLETED,
exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=secondJob.fifthStep with status=COMPLETED
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=secondJob.end5
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=secondJob.end5 with status=COMPLETED
25.11.2012 21:29:20 DEBUG (AbstractJob.java:294) - Job execution complete: JobExecution: id=1, version=1, startTime=Sun Nov 25 21:29:20 GMT 2012,
endTime=null, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=, job=[JobInstance: id=1,
version=0, JobParameters=[{currentTime=1353878959462}], Job=[secondJob]]
25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:121) - Job: [FlowJob: [name=secondJob]] completed with
the following parameters: [{currentTime=1353878959462}] and the following status: [COMPLETED]
25.11.2012 21:29:20 DEBUG (BatchProcessStarter.java:48) - JobExecution: id=1, version=2, startTime=Sun Nov 25 21:29:20 GMT 2012,
endTime=Sun Nov 25 21:29:20 GMT 2012, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=,
job=[JobInstance: id=1, version=0, JobParameters=[{currentTime=1353878959462}], Job=[secondJob]]

Third Job’ s console output :

25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [name=thirdJob]] launched with the following parameters: [{currentTime=1353878959462}]
25.11.2012 21:29:20 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id=2, version=0, startTime=null, endTime=null,
lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=STARTING, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=2, version=0,
JobParameters=[{currentTime=1353878959462}], Job=[thirdJob]]
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:135) - Resuming state=thirdJob.sixthStep with status=UNKNOWN
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=thirdJob.sixthStep
25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [sixthStep]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=6
25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Sixth Task is executed...
25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=6, version=3, name=sixthStep, status=COMPLETED,
exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=thirdJob.sixthStep with status=COMPLETED

25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=thirdJob.seventhStep
25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [seventhStep]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=7
25.11.2012 21:29:20 DEBUG (FailedStepTasklet.java:33) - Task Result : Error occurred!
25.11.2012 21:29:20 DEBUG (TaskletStep.java:456) - Rollback for Exception: java.lang.Exception: Error occurred!
25.11.2012 21:29:20 DEBUG (TransactionTemplate.java:152) - Initiating transaction rollback on application exception

...

25.11.2012 21:29:20 DEBUG (AbstractPlatformTransactionManager.java:821) - Initiating transaction rollback
25.11.2012 21:29:20 DEBUG (ResourcelessTransactionManager.java:54) - Rolling back resourceless transaction
on [org.springframework.batch.support.transaction.ResourcelessTransactionManager
$ResourcelessTransaction@40874c04]
25.11.2012 21:29:20 DEBUG (RepeatTemplate.java:291) - Handling exception: java.lang.Exception, caused by: java.lang.Exception: Error occurred!
25.11.2012 21:29:20 DEBUG (RepeatTemplate.java:251) - Handling fatal exception explicitly (rethrowing first of 1): java.lang.Exception: Error occurred!
25.11.2012 21:29:20 ERROR (AbstractStep.java:222) - Encountered an error executing the step

...

25.11.2012 21:29:20 DEBUG (ResourcelessTransactionManager.java:34) - Committing resourceless transaction on
[org.springframework.batch.support.transaction.ResourcelessTransactionManager
$ResourcelessTransaction@66a7d863]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=7, version=2,
name=seventhStep, status=FAILED, exitStatus=FAILED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0,
writeSkipCount=0, processSkipCount=0, commitCount=0, rollbackCount=1
25.11.2012 21:29:20 DEBUG (ResourcelessTransactionManager.java:34) - Committing resourceless transaction on
[org.springframework.batch.support.transaction.ResourcelessTransactionManager
$ResourcelessTransaction@156f803c]
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=thirdJob.seventhStep with status=FAILED
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=thirdJob.fail8
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=thirdJob.fail8 with status=FAILED
25.11.2012 21:29:20 DEBUG (AbstractJob.java:294) - Job execution complete: JobExecution: id=2, version=1,
startTime=Sun Nov 25 21:29:20 GMT 2012, endTime=null, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=FAILED,
exitStatus=exitCode=FAILED;exitDescription=, job=[JobInstance: id=2, version=0, JobParameters=[{currentTime=1353878959462}], Job=[thirdJob]]
25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:121) - Job: [FlowJob: [name=thirdJob]] completed with
the following parameters: [{currentTime=1353878959462}] and the following status: [FAILED]
25.11.2012 21:29:20 DEBUG (BatchProcessStarter.java:52) - JobExecution: id=2, version=2, startTime=Sun Nov 25 21:29:20 GMT 2012,
endTime=Sun Nov 25 21:29:20 GMT 2012, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=FAILED, exitStatus=exitCode=FAILED;
exitDescription=, job=[JobInstance: id=2, version=0, JobParameters=[{currentTime=1353878959462}], Job=[thirdJob]]

First Job’ s console output after restarting :

25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [name=firstJob]] launched with the following parameters: [{currentTime=1353878960660}]
25.11.2012 21:29:20 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id=3, version=0, startTime=null,
endTime=null, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=STARTING, exitStatus=exitCode=UNKNOWN;exitDescription=,
job=[JobInstance: id=3, version=0, JobParameters=[{currentTime=1353878960660}], Job=[firstJob]]
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:135) - Resuming state=firstJob.firstStep with status=UNKNOWN
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.firstStep
25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [firstStep]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=8
25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : First Task is executed...
25.11.2012 21:29:20 DEBUG (AbstractStep.java:209) - Step execution success: id=8
25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=8, version=3, name=firstStep,
status=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.firstStep with status=COMPLETED

25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.secondStep
25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [secondStep]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=9
25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Second Task is executed...
25.11.2012 21:29:20 DEBUG (TaskletStep.java:417) - Applying contribution: [StepContribution: read=0, written=0, filtered=0,
readSkips=0, writeSkips=0, processSkips=0, exitStatus=EXECUTING]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:209) - Step execution success: id=9
25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=9, version=3, name=secondStep,
status=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.secondStep with status=COMPLETED

25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.thirdStep
25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [thirdStep]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=10
25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Third Task is executed...
25.11.2012 21:29:20 DEBUG (TaskletStep.java:417) - Applying contribution: [StepContribution: read=0, written=0, filtered=0,
readSkips=0, writeSkips=0, processSkips=0, exitStatus=EXECUTING]
25.11.2012 21:29:20 DEBUG (AbstractStep.java:209) - Step execution success: id=10
25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=10, version=3, name=thirdStep,
status=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.thirdStep with status=COMPLETED
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.end3
25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.end3 with status=COMPLETED
25.11.2012 21:29:20 DEBUG (AbstractJob.java:294) - Job execution complete: JobExecution: id=3, version=1, startTime=Sun Nov 25 21:29:20 GMT 2012,
endTime=null, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=, job=[JobInstance: id=3,
version=0, JobParameters=[{currentTime=1353878960660}], Job=[firstJob]]
25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:121) - Job: [FlowJob: [name=firstJob]] completed with
the following parameters: [{currentTime=1353878960660}] and the following status: [COMPLETED]
25.11.2012 21:29:20 DEBUG (BatchProcessStarter.java:57) - JobExecution: id=3, version=2, startTime=Sun Nov 25 21:29:20 GMT 2012,
endTime=Sun Nov 25 21:29:20 GMT 2012, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=,
job=[JobInstance: id=3, version=0, JobParameters=[{currentTime=1353878960660}], Job=[firstJob]]

STEP 11 : DOWNLOAD

https://github.com/erenavsarogullari/OTV_SpringBatch_TaskletStep

Related Links :

Spring Batch – Reference Documentation
Spring Batch – API Documentation

 

Reference: TaskletStep Oriented Processing in Spring Batch from our JCG partner Eren Avsarogullari at the Online Technology Vision blog.

Do you want to know how to develop your skillset to become a Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you two of our best selling eBooks for FREE!

JPA Mini Book

Learn how to leverage the power of JPA in order to create robust and flexible Java applications. With this Mini Book, you will get introduced to JPA and smoothly transition to more advanced concepts.

JVM Troubleshooting Guide

The Java virtual machine is really the foundation of any Java EE platform. Learn how to master it with this advanced guide!

Given email address is already subscribed, thank you!
Oops. Something went wrong. Please try again later.
Please provide a valid email address.
Thank you, your sign-up request was successful! Please check your e-mail inbox.
Please complete the CAPTCHA.
Please fill in the required fields.

Leave a Reply


four × = 36



Java Code Geeks and all content copyright © 2010-2014, Exelixis Media Ltd | Terms of Use | Privacy Policy | Contact
All trademarks and registered trademarks appearing on Java Code Geeks are the property of their respective owners.
Java is a trademark or registered trademark of Oracle Corporation in the United States and other countries.
Java Code Geeks is not connected to Oracle Corporation and is not sponsored by Oracle Corporation.
Do you want to know how to develop your skillset and become a ...
Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you two of our best selling eBooks for FREE!

Get ready to Rock!
You can download the complementary eBooks using the links below:
Close