{"id":4437,"date":"2012-12-04T22:00:39","date_gmt":"2012-12-04T20:00:39","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=4437"},"modified":"2012-12-03T19:57:24","modified_gmt":"2012-12-03T17:57:24","slug":"taskletstep-oriented-processing-in-spring-batch","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html","title":{"rendered":"TaskletStep Oriented Processing in Spring Batch"},"content":{"rendered":"<p>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.<\/p>\n<p>Spring Batch offers \u2018TaskletStep Oriented\u2019 and \u2018Chunk Oriented\u2019 processing style. In this article, TaskletStep Oriented Processing Model is explained.<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\nLet us investigate fundamental Spring Batch components :<\/p>\n<h4>Job :<\/h4>\n<p> An entity that encapsulates an entire batch process. Step and Tasklets are defined under a Job<\/p>\n<h4>Step :<\/h4>\n<p> A domain object that encapsulates an independent, sequential phase of a batch job.<\/p>\n<h4>JobInstance :<\/h4>\n<p> Batch domain object representing a uniquely identifiable job run \u2013 it\u2019s identity is given by the pair Job and JobParameters.<\/p>\n<h4>JobParameters :<\/h4>\n<p> Value object representing runtime parameters to a batch job.<\/p>\n<h4>JobExecution :<\/h4>\n<p> 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.<\/p>\n<h4>JobRepository :<\/h4>\n<p> An interface which responsible for persistence of batch meta-data entities. In the following sample, an in-memory repository is used via MapJobRepositoryFactoryBean.<\/p>\n<h4>JobLauncher :<\/h4>\n<p> An interface exposing run method, which launches and controls the defined jobs.<\/p>\n<h4>TaskLet :<\/h4>\n<p> 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.<\/p>\n<p>Let us take a look how to develop Tasklet-Step Oriented Processing Model.<\/p>\n<h4>Used Technologies :<\/h4>\n<ul>\n<li>JDK 1.7.0_09<\/li>\n<li>Spring 3.1.3<\/li>\n<li>Spring Batch 2.1.9<\/li>\n<li>Maven 3.0.4<\/li>\n<\/ul>\n<h3>STEP 1 : CREATE MAVEN PROJECT<\/h3>\n<p>A maven project is created as below. (It can be created by using Maven or IDE Plug-in).<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/OTV_SpringBatch_TaskletStep_Oriented_Processing.png\"><img decoding=\"async\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/OTV_SpringBatch_TaskletStep_Oriented_Processing.png\" alt=\"\" title=\"OTV_SpringBatch_TaskletStep_Oriented_Processing\" width=\"313\" height=\"384\" \/><\/a><\/p>\n<h3>STEP 2 : LIBRARIES<\/h3>\n<p>Firstly, dependencies are added to Maven\u2019 s pom.xml.<\/p>\n<pre class=\"brush:xml\">    &lt;properties&gt;\r\n\t\t&lt;spring.version&gt;3.1.3.RELEASE&lt;\/spring.version&gt;\r\n\t\t&lt;spring-batch.version&gt;2.1.9.RELEASE&lt;\/spring-batch.version&gt;\r\n    &lt;\/properties&gt;\r\n\r\n\t&lt;dependencies&gt;\r\n\t\t&lt;!-- Spring Dependencies --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;spring-core&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;${spring.version}&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;spring-context&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;${spring.version}&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;    \r\n\r\n\t\t&lt;!-- Spring Batch Dependency --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.springframework.batch&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;spring-batch-core&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;${spring-batch.version}&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\r\n\t\t&lt;!-- Log4j library --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;log4j&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;log4j&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;1.2.16&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\r\n\t&lt;\/dependencies&gt;<\/pre>\n<p><strong>maven-compiler-plugin<\/strong>(Maven Plugin) is used to compile the project with JDK 1.7<\/p>\n<pre class=\"brush:xml\">\t&lt;plugin&gt;\r\n\t\t&lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\r\n\t\t&lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\r\n\t\t&lt;version&gt;3.0&lt;\/version&gt;\r\n\t\t&lt;configuration&gt;\r\n\t\t  &lt;source&gt;1.7&lt;\/source&gt;\r\n\t\t  &lt;target&gt;1.7&lt;\/target&gt;\r\n\t\t&lt;\/configuration&gt;\r\n\t&lt;\/plugin&gt;<\/pre>\n<p>The following Maven plugin can be used to create <strong>runnable-jar<\/strong>,<\/p>\n<pre class=\"brush:xml\">\t&lt;plugin&gt;\r\n\t\t&lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\r\n\t\t&lt;artifactId&gt;maven-shade-plugin&lt;\/artifactId&gt;\r\n\t\t&lt;version&gt;2.0&lt;\/version&gt;\r\n\r\n\t\t&lt;executions&gt;\r\n\t\t\t&lt;execution&gt;\r\n\t\t\t\t&lt;phase&gt;package&lt;\/phase&gt;\r\n\t\t\t\t&lt;goals&gt;\r\n\t\t\t\t\t&lt;goal&gt;shade&lt;\/goal&gt;\r\n\t\t\t\t&lt;\/goals&gt;\r\n\t\t\t\t&lt;configuration&gt;\r\n\t\t\t\t\t&lt;configuration&gt;\r\n\t\t\t          &lt;source&gt;1.7&lt;\/source&gt;\r\n\t\t\t          &lt;target&gt;1.7&lt;\/target&gt;\r\n\t\t\t        &lt;\/configuration&gt;\r\n\t\t\t\t\t&lt;transformers&gt;\r\n\t\t\t\t\t\t&lt;transformer\r\n\t\t\t\t\t\timplementation=\r\n                              'org.apache.maven.plugins.shade.resource.ManifestResourceTransformer'&gt;\r\n\t\t\t\t\t\t\t&lt;mainClass&gt;com.onlinetechvision.exe.Application&lt;\/mainClass&gt;\r\n\t\t\t\t\t\t&lt;\/transformer&gt;\r\n\t\t\t\t\t\t&lt;transformer\r\n\t\t\t\t\t\timplementation=\r\n                                     'org.apache.maven.plugins.shade.resource.AppendingTransformer'&gt;\r\n\t\t\t\t\t\t\t&lt;resource&gt;META-INF\/spring.handlers&lt;\/resource&gt;\r\n\t\t\t\t\t\t&lt;\/transformer&gt;\r\n\t\t\t\t\t\t&lt;transformer\r\n\t\t\t\t\t\timplementation=\r\n                                     'org.apache.maven.plugins.shade.resource.AppendingTransformer'&gt;\r\n\t\t\t\t\t\t\t&lt;resource&gt;META-INF\/spring.schemas&lt;\/resource&gt;\r\n\t\t\t\t\t\t&lt;\/transformer&gt;\r\n\t\t\t\t\t&lt;\/transformers&gt;\r\n\t\t\t\t&lt;\/configuration&gt;\r\n\t\t\t&lt;\/execution&gt;\r\n\t\t&lt;\/executions&gt;\r\n\t&lt;\/plugin&gt;<\/pre>\n<h3>STEP 3 : CREATE SuccessfulStepTasklet TASKLET<\/h3>\n<p>SuccessfulStepTasklet is created by implementing Tasklet Interface. It illustrates business logic in successful step.<\/p>\n<pre class=\"brush:java\">package com.onlinetechvision.tasklet;\r\n\r\nimport org.apache.log4j.Logger;\r\nimport org.springframework.batch.core.StepContribution;\r\nimport org.springframework.batch.core.scope.context.ChunkContext;\r\nimport org.springframework.batch.core.step.tasklet.Tasklet;\r\nimport org.springframework.batch.repeat.RepeatStatus;\r\n\r\n\/**\r\n * SuccessfulStepTasklet Class illustrates a successful job\r\n *\r\n * @author onlinetechvision.com\r\n * @since 27 Nov 2012\r\n * @version 1.0.0\r\n *\r\n *\/\r\npublic class SuccessfulStepTasklet implements Tasklet {\r\n\r\n\tprivate static final Logger logger = Logger.getLogger(SuccessfulStepTasklet.class);\r\n\r\n    private String taskResult;\r\n\r\n    \/**\r\n     * Executes SuccessfulStepTasklet\r\n     *\r\n     * @param StepContribution stepContribution\r\n     * @param ChunkContext chunkContext\r\n     * @return RepeatStatus\r\n     * @throws Exception\r\n     *\r\n     *\/\r\n    @Override\r\n\tpublic RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {\r\n    \tlogger.debug('Task Result : ' + getTaskResult());\r\n    \treturn RepeatStatus.FINISHED;\r\n\t}\r\n\r\n\tpublic String getTaskResult() {\r\n\t\treturn taskResult;\r\n\t}\r\n\r\n\tpublic void setTaskResult(String taskResult) {\r\n\t\tthis.taskResult = taskResult;\r\n\t} \r\n\r\n}<\/pre>\n<h3>STEP 4 : CREATE FailedStepTasklet TASKLET<\/h3>\n<p>FailedStepTasklet is created by implementing Tasklet Interface. It illustrates business logic in failed step.<\/p>\n<pre class=\"brush:java\">package com.onlinetechvision.tasklet;\r\n\r\nimport org.apache.log4j.Logger;\r\nimport org.springframework.batch.core.StepContribution;\r\nimport org.springframework.batch.core.scope.context.ChunkContext;\r\nimport org.springframework.batch.core.step.tasklet.Tasklet;\r\nimport org.springframework.batch.repeat.RepeatStatus;\r\n\r\n\/**\r\n * FailedStepTasklet Class illustrates a failed job.\r\n *\r\n * @author onlinetechvision.com\r\n * @since 27 Nov 2012\r\n * @version 1.0.0\r\n *\r\n *\/\r\npublic class FailedStepTasklet implements Tasklet {\r\n\r\n\tprivate static final Logger logger = Logger.getLogger(FailedStepTasklet.class);\r\n\r\n    private String taskResult;\r\n\r\n    \/**\r\n     * Executes FailedStepTasklet\r\n     *\r\n     * @param StepContribution stepContribution\r\n     * @param ChunkContext chunkContext\r\n     * @return RepeatStatus\r\n     * @throws Exception\r\n     *\r\n     *\/\r\n    @Override\r\n\tpublic RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {\r\n    \tlogger.debug('Task Result : ' + getTaskResult());\r\n    \tthrow new Exception('Error occurred!');\r\n\t}\r\n\r\n\tpublic String getTaskResult() {\r\n\t\treturn taskResult;\r\n\t}\r\n\r\n\tpublic void setTaskResult(String taskResult) {\r\n\t\tthis.taskResult = taskResult;\r\n\t} \r\n\r\n}<\/pre>\n<h3>STEP 5 : CREATE BatchProcessStarter CLASS<\/h3>\n<p>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 \u201cA job instance already exists and is complete\u201d description. It can be restarted with different parameter. In the following sample, different currentTime parameter is set in order to restart FirstJob.<\/p>\n<pre class=\"brush:java\">package com.onlinetechvision.spring.batch;\r\n\r\nimport org.apache.log4j.Logger;\r\nimport org.springframework.batch.core.Job;\r\nimport org.springframework.batch.core.JobExecution;\r\nimport org.springframework.batch.core.JobParametersBuilder;\r\nimport org.springframework.batch.core.JobParametersInvalidException;\r\nimport org.springframework.batch.core.launch.JobLauncher;\r\nimport org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;\r\nimport org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;\r\nimport org.springframework.batch.core.repository.JobRepository;\r\nimport org.springframework.batch.core.repository.JobRestartException;\r\n\r\n\/**\r\n * BatchProcessStarter Class launches the jobs and logs their execution results.\r\n *\r\n * @author onlinetechvision.com\r\n * @since 27 Nov 2012\r\n * @version 1.0.0\r\n *\r\n *\/\r\npublic class BatchProcessStarter {\r\n\r\n\tprivate static final Logger logger = Logger.getLogger(BatchProcessStarter.class);\r\n\r\n\tprivate Job firstJob;\r\n\tprivate Job secondJob;\r\n\tprivate Job thirdJob;\r\n\tprivate JobLauncher jobLauncher;\r\n\tprivate JobRepository jobRepository;\r\n\r\n\t\/**\r\n     * Starts the jobs and logs their execution results.\r\n     *\r\n     *\/\r\n\tpublic void start() {\r\n\t\tJobExecution jobExecution = null;\r\n\t\tJobParametersBuilder builder = new JobParametersBuilder();\r\n\r\n\t\ttry {\r\n\r\n\t\t\tbuilder.addLong('currentTime', new Long(System.currentTimeMillis()));\r\n\t\t\tgetJobLauncher().run(getFirstJob(), builder.toJobParameters());\r\n\t\t\tjobExecution = getJobRepository().getLastJobExecution(getFirstJob().getName(), builder.toJobParameters());\r\n\t\t\tlogger.debug(jobExecution.toString());\t\t\t\r\n\r\n\t\t\tgetJobLauncher().run(getSecondJob(), builder.toJobParameters());\r\n\t\t\tjobExecution = getJobRepository().getLastJobExecution(getSecondJob().getName(), builder.toJobParameters());\r\n\t\t\tlogger.debug(jobExecution.toString());\r\n\r\n\t\t\tgetJobLauncher().run(getThirdJob(), builder.toJobParameters());\r\n\t\t\tjobExecution = getJobRepository().getLastJobExecution(getThirdJob().getName(), builder.toJobParameters());\r\n\t\t\tlogger.debug(jobExecution.toString());\r\n\r\n\t\t\tbuilder.addLong('currentTime', new Long(System.currentTimeMillis()));\r\n\t\t\tgetJobLauncher().run(getFirstJob(), builder.toJobParameters());\r\n\t\t\tjobExecution = getJobRepository().getLastJobExecution(getFirstJob().getName(), builder.toJobParameters());\r\n\t\t\tlogger.debug(jobExecution.toString());\r\n\r\n\t\t} catch (JobExecutionAlreadyRunningException\r\n\t\t\t\t\t| JobRestartException\r\n\t\t\t\t\t| JobInstanceAlreadyCompleteException\r\n\t\t\t\t\t| JobParametersInvalidException e) {\r\n\t\t\tlogger.error(e);\r\n\t\t}\r\n\r\n\t}\t\r\n\r\n\tpublic Job getFirstJob() {\r\n\t\treturn firstJob;\r\n\t}\r\n\r\n\tpublic void setFirstJob(Job firstJob) {\r\n\t\tthis.firstJob = firstJob;\r\n\t}\r\n\r\n\tpublic Job getSecondJob() {\r\n\t\treturn secondJob;\r\n\t}\r\n\r\n\tpublic void setSecondJob(Job secondJob) {\r\n\t\tthis.secondJob = secondJob;\r\n\t}\t\r\n\r\n\tpublic Job getThirdJob() {\r\n\t\treturn thirdJob;\r\n\t}\r\n\r\n\tpublic void setThirdJob(Job thirdJob) {\r\n\t\tthis.thirdJob = thirdJob;\r\n\t}\r\n\r\n\tpublic JobLauncher getJobLauncher() {\r\n\t\treturn jobLauncher;\r\n\t}\r\n\r\n\tpublic void setJobLauncher(JobLauncher jobLauncher) {\r\n\t\tthis.jobLauncher = jobLauncher;\r\n\t}\r\n\r\n\tpublic JobRepository getJobRepository() {\r\n\t\treturn jobRepository;\r\n\t}\r\n\r\n\tpublic void setJobRepository(JobRepository jobRepository) {\r\n\t\tthis.jobRepository = jobRepository;\r\n\t}\t\r\n\r\n}<\/pre>\n<h3>STEP 6 : CREATE applicationContext.xml <\/h3>\n<p>Spring Configuration file, <strong>applicationContext.xml<\/strong>, is created. It covers Tasklets and BatchProcessStarter definitions.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\" brush:xml\">&lt;?xml version='1.0' encoding='UTF-8'?&gt;\r\n&lt;beans xmlns='http:\/\/www.springframework.org\/schema\/beans'\r\n\txmlns:xsi='http:\/\/www.w3.org\/2001\/XMLSchema-instance'\r\n\txmlns:batch='http:\/\/www.springframework.org\/schema\/batch'\r\n\txsi:schemaLocation='http:\/\/www.springframework.org\/schema\/beans \r\n\r\nhttp:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd\r\n\r\nhttp:\/\/www.springframework.org\/schema\/batch\r\n\r\nhttp:\/\/www.springframework.org\/schema\/batch\/spring-batch-2.1.xsd'&gt;\r\n\r\n    &lt;bean id='firstTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'&gt;\r\n    \t&lt;property name='taskResult'  value='First Task is executed...' \/&gt;\r\n    &lt;\/bean&gt;\r\n\r\n    &lt;bean id='secondTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'&gt;\r\n    \t&lt;property name='taskResult'  value='Second Task is executed...' \/&gt;\r\n    &lt;\/bean&gt;\r\n\r\n    &lt;bean id='thirdTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'&gt;\r\n    \t&lt;property name='taskResult'  value='Third Task is executed...' \/&gt;\r\n    &lt;\/bean&gt;\r\n\r\n    &lt;bean id='fourthTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'&gt;\r\n    \t&lt;property name='taskResult'  value='Fourth Task is executed...' \/&gt;\r\n    &lt;\/bean&gt;\r\n\r\n    &lt;bean id='fifthTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'&gt;\r\n    \t&lt;property name='taskResult'  value='Fifth Task is executed...' \/&gt;\r\n    &lt;\/bean&gt;\r\n\r\n    &lt;bean id='sixthTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'&gt;\r\n    \t&lt;property name='taskResult'  value='Sixth Task is executed...' \/&gt;\r\n    &lt;\/bean&gt;\r\n\r\n     &lt;bean id='seventhTasklet' class='com.onlinetechvision.tasklet.SuccessfulStepTasklet'&gt;\r\n    \t&lt;property name='taskResult'  value='Seventh Task is executed...' \/&gt;\r\n    &lt;\/bean&gt;\r\n\r\n    &lt;bean id='failedStepTasklet' class='com.onlinetechvision.tasklet.FailedStepTasklet'&gt;\r\n    \t&lt;property name='taskResult'  value='Error occurred!' \/&gt;\r\n    &lt;\/bean&gt;    \r\n\r\n\t&lt;bean id='batchProcessStarter' class='com.onlinetechvision.spring.batch.BatchProcessStarter'&gt;\r\n\t\t&lt;property name='jobLauncher' ref='jobLauncher'\/&gt;\r\n\t\t&lt;property name='jobRepository' ref='jobRepository'\/&gt;\r\n\t\t&lt;property name='firstJob' ref='firstJob'\/&gt;\r\n\t\t&lt;property name='secondJob' ref='secondJob'\/&gt;\r\n\t\t&lt;property name='thirdJob' ref='thirdJob'\/&gt;\r\n    &lt;\/bean&gt;    \r\n\r\n&lt;\/beans&gt;<\/pre>\n<h3>STEP 7 : CREATE jobContext.xml <\/h3>\n<p>Spring Configuration file, <strong>jobContext.xml<\/strong>, is created. Jobs\u2019 flows are the following :<\/p>\n<h4>FirstJob\u2019 s flow :<\/h4>\n<p>1) FirstStep is started.<br \/>\n2) After FirstStep is completed with COMPLETED status, SecondStep is started.<br \/>\n3) After SecondStep is completed with COMPLETED status, ThirdStep is started.<br \/>\n4) After ThirdStep is completed with COMPLETED status, FirstJob execution is completed with COMPLETED status.<\/p>\n<h4>SecondJob\u2019 s flow :<\/h4>\n<p>1) FourthStep is started.<br \/>\n2) After FourthStep is completed with COMPLETED status, FifthStep is started.<br \/>\n3) After FifthStep is completed with COMPLETED status, SecondJob execution is completed with COMPLETED status.<\/p>\n<h4>ThirdJob\u2019 s flow :<\/h4>\n<p>1) SixthStep is started.<br \/>\n2) After SixthStep is completed with COMPLETED status, SeventhStep is started.<br \/>\n3) After SeventhStep is completed with FAILED status, ThirdJob execution is completed FAILED status.<\/p>\n<p>FirstJob\u2019 s flow is same with the first execution.<\/p>\n<pre class=\" brush:xml\">&lt;?xml version='1.0' encoding='UTF-8'?&gt;\r\n&lt;beans xmlns='http:\/\/www.springframework.org\/schema\/beans'\r\n\txmlns:xsi='http:\/\/www.w3.org\/2001\/XMLSchema-instance'\r\n\txmlns:batch='http:\/\/www.springframework.org\/schema\/batch'\r\n\txsi:schemaLocation='http:\/\/www.springframework.org\/schema\/beans \r\n\r\nhttp:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd\r\n\r\nhttp:\/\/www.springframework.org\/schema\/batch\r\n\r\nhttp:\/\/www.springframework.org\/schema\/batch\/spring-batch-2.1.xsd'&gt;\r\n\r\n    &lt;import resource='applicationContext.xml'\/&gt;\r\n\r\n    &lt;bean id='transactionManager' class='org.springframework.batch.support.transaction.ResourcelessTransactionManager'\/&gt;\r\n\r\n    &lt;bean id='jobRepository' class='org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean'&gt;\r\n\t\t&lt;property name='transactionManager' ref='transactionManager' \/&gt;\r\n    &lt;\/bean&gt;\r\n\r\n    &lt;bean id='jobLauncher' class='org.springframework.batch.core.launch.support.SimpleJobLauncher' &gt;\r\n        &lt;property name='jobRepository' ref='jobRepository'\/&gt;\r\n    &lt;\/bean&gt;\r\n\r\n     &lt;bean id='taskletStep' class='org.springframework.batch.core.step.tasklet.TaskletStep'&gt;\r\n        &lt;property name='jobRepository' ref='jobRepository'\/&gt;\r\n        &lt;property name='transactionManager' ref='transactionManager'\/&gt;\r\n    &lt;\/bean&gt;\r\n\r\n    &lt;batch:job id='firstJob'&gt;\r\n\t    &lt;batch:step id='firstStep' next='secondStep'&gt;\r\n\t\t\t&lt;batch:tasklet ref='firstTasklet'\/&gt;\r\n\t\t&lt;\/batch:step&gt;\r\n\t\t&lt;batch:step id='secondStep' next='thirdStep' &gt;\r\n\t\t\t&lt;batch:tasklet ref='secondTasklet'\/&gt;\r\n\t\t&lt;\/batch:step&gt;\r\n\t\t&lt;batch:step id='thirdStep'&gt;\r\n\t\t\t&lt;batch:tasklet ref='thirdTasklet' \/&gt;\r\n\t\t&lt;\/batch:step&gt;\r\n\t&lt;\/batch:job&gt;\r\n\r\n\t&lt;batch:job id='secondJob'&gt;\r\n\t\t&lt;batch:step id='fourthStep'&gt;\r\n\t\t\t&lt;batch:tasklet ref='fourthTasklet' \/&gt;\r\n\t        &lt;batch:next on='*' to='fifthStep' \/&gt;\r\n\t        &lt;batch:next on='FAILED' to='failedStep' \/&gt;\r\n\t    &lt;\/batch:step&gt;\r\n\t    &lt;batch:step id='fifthStep'&gt;\r\n\t\t\t&lt;batch:tasklet ref='fifthTasklet' \/&gt;\r\n\t\t&lt;\/batch:step&gt;\r\n\t\t&lt;batch:step id='failedStep'&gt;\r\n\t\t\t&lt;batch:tasklet ref='failedStepTasklet' \/&gt;\r\n\t\t&lt;\/batch:step&gt;\r\n\t&lt;\/batch:job&gt;\r\n\r\n\t&lt;batch:job id='thirdJob'&gt;\r\n\t\t&lt;batch:step id='sixthStep'&gt;\r\n\t\t\t&lt;batch:tasklet ref='sixthTasklet' \/&gt;\r\n\t        &lt;batch:next on='*' to='seventhStep' \/&gt;\r\n\t        &lt;batch:next on='FAILED' to='eighthStep' \/&gt;\r\n\t    &lt;\/batch:step&gt;\r\n\t    &lt;batch:step id='seventhStep'&gt;\r\n\t\t\t&lt;batch:tasklet ref='failedStepTasklet' \/&gt;\r\n\t\t&lt;\/batch:step&gt;\r\n\t\t&lt;batch:step id='eighthStep'&gt;\r\n\t\t\t&lt;batch:tasklet ref='seventhTasklet' \/&gt;\r\n\t\t&lt;\/batch:step&gt;\r\n\t&lt;\/batch:job&gt;\r\n\r\n&lt;\/beans&gt;<\/pre>\n<h3>STEP 8 : CREATE Application CLASS<\/h3>\n<p>Application Class is created to run the application.<\/p>\n<pre class=\"brush:java\">package com.onlinetechvision.exe;\r\n\r\nimport org.springframework.context.ApplicationContext;\r\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\r\n\r\nimport com.onlinetechvision.spring.batch.BatchProcessStarter;\r\n\r\n\/**\r\n * Application Class starts the application.\r\n *\r\n * @author onlinetechvision.com\r\n * @since 27 Nov 2012\r\n * @version 1.0.0\r\n *\r\n *\/\r\npublic class Application {\r\n\r\n\t\/**\r\n     * Starts the application\r\n     *\r\n     * @param  String[] args\r\n     *\r\n     *\/\r\n\tpublic static void main(String[] args) {\r\n\t\tApplicationContext appContext = new ClassPathXmlApplicationContext('jobContext.xml');\r\n\t\tBatchProcessStarter batchProcessStarter = (BatchProcessStarter)appContext.getBean('batchProcessStarter');\r\n\t\tbatchProcessStarter.start();\r\n\t}\r\n\r\n}<\/pre>\n<h3>STEP 9 : BUILD PROJECT<\/h3>\n<p>After OTV_SpringBatch_TaskletStep_Oriented_Processing Project is built, <strong>OTV_SpringBatch_TaskletStep-0.0.1-SNAPSHOT.jar<\/strong> will be created.<\/p>\n<h3>STEP 10 : RUN PROJECT<\/h3>\n<p>After created <strong>OTV_SpringBatch_TaskletStep-0.0.1-SNAPSHOT.jar<\/strong> file is run, the following console output logs will be shown :<\/p>\n<h4>First Job\u2019 s console output :<\/h4>\n<pre class=\"brush:bash\">25.11.2012 21:29:19  INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [name=firstJob]] launched\r\nwith the following parameters: [{currentTime=1353878959462}]\r\n25.11.2012 21:29:19 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id=0, version=0,\r\nstartTime=null, endTime=null, lastUpdated=Sun Nov 25 21:29:19 GMT 2012, status=STARTING, exitStatus=exitCode=UNKNOWN;\r\nexitDescription=, job=[JobInstance: id=0, version=0, JobParameters=[{currentTime=1353878959462}], Job=[firstJob]]\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:135) - Resuming state=firstJob.firstStep with status=UNKNOWN\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.firstStep\r\n25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [firstStep]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=1\r\n25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : First Task is executed...\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:209) - Step execution success: id=1\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=1, version=3,\r\nname=firstStep, status=COMPLETED, exitStatus=COMPLETED,\r\nreadCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.firstStep with status=COMPLETED\r\n\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.secondStep\r\n25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [secondStep]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=2\r\n25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Second Task is executed...\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:209) - Step execution success: id=2\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=2, version=3,\r\nname=secondStep, status=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0,\r\nwriteSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.secondStep with status=COMPLETED\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.thirdStep\r\n\r\n25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [thirdStep]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=3\r\n25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Third Task is executed...\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=3, version=3, name=thirdStep,\r\nstatus=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0,\r\nprocessSkipCount=0, commitCount=1, rollbackCount=0\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.thirdStep with status=COMPLETED\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.end3\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.end3 with status=COMPLETED\r\n25.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,\r\nendTime=null, lastUpdated=Sun Nov 25 21:29:19 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=,\r\njob=[JobInstance: id=0, version=0, JobParameters=[{currentTime=1353878959462}], Job=[firstJob]]\r\n25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:121) - Job: [FlowJob: [name=firstJob]] completed with the following\r\nparameters: [{currentTime=1353878959462}] and the following status: [COMPLETED]\r\n25.11.2012 21:29:20 DEBUG (BatchProcessStarter.java:44) - JobExecution: id=0, version=2, startTime=Sun Nov 25 21:29:19 GMT 2012,\r\nendTime=Sun Nov 25 21:29:20 GMT 2012, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=,\r\njob=[JobInstance: id=0, version=0, JobParameters=[{currentTime=1353878959462}], Job=[firstJob]]<\/pre>\n<p><strong>Second Job\u2019 s console output :<\/strong><\/p>\n<pre class=\" brush:bash\">25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [name=secondJob]] launched with the following parameters: [{currentTime=1353878959462}]\r\n25.11.2012 21:29:20 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id=1, version=0, startTime=null, endTime=null,\r\nlastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=STARTING, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=1, version=0,\r\nJobParameters=[{currentTime=1353878959462}], Job=[secondJob]]\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:135) - Resuming state=secondJob.fourthStep with status=UNKNOWN\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=secondJob.fourthStep\r\n25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [fourthStep]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=4\r\n25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Fourth Task is executed...\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=4, version=3, name=fourthStep, status=COMPLETED,\r\nexitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=secondJob.fourthStep with status=COMPLETED\r\n\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=secondJob.fifthStep\r\n25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [fifthStep]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=5\r\n25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Fifth Task is executed...\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=5, version=3, name=fifthStep, status=COMPLETED,\r\nexitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=secondJob.fifthStep with status=COMPLETED\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=secondJob.end5\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=secondJob.end5 with status=COMPLETED\r\n25.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,\r\nendTime=null, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=, job=[JobInstance: id=1,\r\nversion=0, JobParameters=[{currentTime=1353878959462}], Job=[secondJob]]\r\n25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:121) - Job: [FlowJob: [name=secondJob]] completed with\r\nthe following parameters: [{currentTime=1353878959462}] and the following status: [COMPLETED]\r\n25.11.2012 21:29:20 DEBUG (BatchProcessStarter.java:48) - JobExecution: id=1, version=2, startTime=Sun Nov 25 21:29:20 GMT 2012,\r\nendTime=Sun Nov 25 21:29:20 GMT 2012, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=,\r\njob=[JobInstance: id=1, version=0, JobParameters=[{currentTime=1353878959462}], Job=[secondJob]]<\/pre>\n<p><strong>Third Job\u2019 s console output :<\/strong><\/p>\n<pre class=\" brush:bash\">25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [name=thirdJob]] launched with the following parameters: [{currentTime=1353878959462}]\r\n25.11.2012 21:29:20 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id=2, version=0, startTime=null, endTime=null,\r\nlastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=STARTING, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=2, version=0,\r\nJobParameters=[{currentTime=1353878959462}], Job=[thirdJob]]\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:135) - Resuming state=thirdJob.sixthStep with status=UNKNOWN\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=thirdJob.sixthStep\r\n25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [sixthStep]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=6\r\n25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Sixth Task is executed...\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=6, version=3, name=sixthStep, status=COMPLETED,\r\nexitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=thirdJob.sixthStep with status=COMPLETED\r\n\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=thirdJob.seventhStep\r\n25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [seventhStep]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=7\r\n25.11.2012 21:29:20 DEBUG (FailedStepTasklet.java:33) - Task Result : Error occurred!\r\n25.11.2012 21:29:20 DEBUG (TaskletStep.java:456) - Rollback for Exception: java.lang.Exception: Error occurred!\r\n25.11.2012 21:29:20 DEBUG (TransactionTemplate.java:152) - Initiating transaction rollback on application exception\r\n\r\n...\r\n\r\n25.11.2012 21:29:20 DEBUG (AbstractPlatformTransactionManager.java:821) - Initiating transaction rollback\r\n25.11.2012 21:29:20 DEBUG (ResourcelessTransactionManager.java:54) - Rolling back resourceless transaction\r\non [org.springframework.batch.support.transaction.ResourcelessTransactionManager\r\n$ResourcelessTransaction@40874c04]\r\n25.11.2012 21:29:20 DEBUG (RepeatTemplate.java:291) - Handling exception: java.lang.Exception, caused by: java.lang.Exception: Error occurred!\r\n25.11.2012 21:29:20 DEBUG (RepeatTemplate.java:251) - Handling fatal exception explicitly (rethrowing first of 1): java.lang.Exception: Error occurred!\r\n25.11.2012 21:29:20 ERROR (AbstractStep.java:222) - Encountered an error executing the step\r\n\r\n...\r\n\r\n25.11.2012 21:29:20 DEBUG (ResourcelessTransactionManager.java:34) - Committing resourceless transaction on\r\n[org.springframework.batch.support.transaction.ResourcelessTransactionManager\r\n$ResourcelessTransaction@66a7d863]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=7, version=2,\r\nname=seventhStep, status=FAILED, exitStatus=FAILED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0,\r\nwriteSkipCount=0, processSkipCount=0, commitCount=0, rollbackCount=1\r\n25.11.2012 21:29:20 DEBUG (ResourcelessTransactionManager.java:34) - Committing resourceless transaction on\r\n[org.springframework.batch.support.transaction.ResourcelessTransactionManager\r\n$ResourcelessTransaction@156f803c]\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=thirdJob.seventhStep with status=FAILED\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=thirdJob.fail8\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=thirdJob.fail8 with status=FAILED\r\n25.11.2012 21:29:20 DEBUG (AbstractJob.java:294) - Job execution complete: JobExecution: id=2, version=1,\r\nstartTime=Sun Nov 25 21:29:20 GMT 2012, endTime=null, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=FAILED,\r\nexitStatus=exitCode=FAILED;exitDescription=, job=[JobInstance: id=2, version=0, JobParameters=[{currentTime=1353878959462}], Job=[thirdJob]]\r\n25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:121) - Job: [FlowJob: [name=thirdJob]] completed with\r\nthe following parameters: [{currentTime=1353878959462}] and the following status: [FAILED]\r\n25.11.2012 21:29:20 DEBUG (BatchProcessStarter.java:52) - JobExecution: id=2, version=2, startTime=Sun Nov 25 21:29:20 GMT 2012,\r\nendTime=Sun Nov 25 21:29:20 GMT 2012, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=FAILED, exitStatus=exitCode=FAILED;\r\nexitDescription=, job=[JobInstance: id=2, version=0, JobParameters=[{currentTime=1353878959462}], Job=[thirdJob]]<\/pre>\n<p><strong>First Job\u2019 s console output after restarting :<\/strong><\/p>\n<pre class=\" brush:bash\">25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [name=firstJob]] launched with the following parameters: [{currentTime=1353878960660}]\r\n25.11.2012 21:29:20 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id=3, version=0, startTime=null,\r\nendTime=null, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=STARTING, exitStatus=exitCode=UNKNOWN;exitDescription=,\r\njob=[JobInstance: id=3, version=0, JobParameters=[{currentTime=1353878960660}], Job=[firstJob]]\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:135) - Resuming state=firstJob.firstStep with status=UNKNOWN\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.firstStep\r\n25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [firstStep]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=8\r\n25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : First Task is executed...\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:209) - Step execution success: id=8\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=8, version=3, name=firstStep,\r\nstatus=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.firstStep with status=COMPLETED\r\n\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.secondStep\r\n25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [secondStep]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=9\r\n25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Second Task is executed...\r\n25.11.2012 21:29:20 DEBUG (TaskletStep.java:417) - Applying contribution: [StepContribution: read=0, written=0, filtered=0,\r\nreadSkips=0, writeSkips=0, processSkips=0, exitStatus=EXECUTING]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:209) - Step execution success: id=9\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=9, version=3, name=secondStep,\r\nstatus=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.secondStep with status=COMPLETED\r\n\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.thirdStep\r\n25.11.2012 21:29:20  INFO (SimpleStepHandler.java:133) - Executing step: [thirdStep]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:180) - Executing: id=10\r\n25.11.2012 21:29:20 DEBUG (SuccessfulStepTasklet.java:33) - Task Result : Third Task is executed...\r\n25.11.2012 21:29:20 DEBUG (TaskletStep.java:417) - Applying contribution: [StepContribution: read=0, written=0, filtered=0,\r\nreadSkips=0, writeSkips=0, processSkips=0, exitStatus=EXECUTING]\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:209) - Step execution success: id=10\r\n25.11.2012 21:29:20 DEBUG (AbstractStep.java:273) - Step execution complete: StepExecution: id=10, version=3, name=thirdStep,\r\nstatus=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.thirdStep with status=COMPLETED\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:143) - Handling state=firstJob.end3\r\n25.11.2012 21:29:20 DEBUG (SimpleFlow.java:156) - Completed state=firstJob.end3 with status=COMPLETED\r\n25.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,\r\nendTime=null, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=, job=[JobInstance: id=3,\r\nversion=0, JobParameters=[{currentTime=1353878960660}], Job=[firstJob]]\r\n25.11.2012 21:29:20  INFO (SimpleJobLauncher.java:121) - Job: [FlowJob: [name=firstJob]] completed with\r\nthe following parameters: [{currentTime=1353878960660}] and the following status: [COMPLETED]\r\n25.11.2012 21:29:20 DEBUG (BatchProcessStarter.java:57) - JobExecution: id=3, version=2, startTime=Sun Nov 25 21:29:20 GMT 2012,\r\nendTime=Sun Nov 25 21:29:20 GMT 2012, lastUpdated=Sun Nov 25 21:29:20 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=,\r\njob=[JobInstance: id=3, version=0, JobParameters=[{currentTime=1353878960660}], Job=[firstJob]]<\/pre>\n<h3>STEP 11 : DOWNLOAD<\/h3>\n<p><strong><a title=\"https:\/\/github.com\/erenavsarogullari\/OTV_SpringBatch_TaskletStep\" href=\"https:\/\/github.com\/erenavsarogullari\/OTV_SpringBatch_TaskletStep\" target=\"_blank\">https:\/\/github.com\/erenavsarogullari\/OTV_SpringBatch_TaskletStep<\/a><\/strong><\/p>\n<p><strong>Related Links :<\/strong><\/p>\n<p><strong><a title=\"Spring Batch - Reference Documentation\" href=\"http:\/\/static.springsource.org\/spring-batch\/reference\/index.html\" target=\"_blank\">Spring Batch \u2013 Reference Documentation<\/a><\/strong><br \/>\n<strong><a title=\"Spring Batch - API Documentation\" href=\"http:\/\/static.springsource.org\/spring-batch\/apidocs\/index.html\" target=\"_blank\">Spring Batch \u2013 API Documentation<\/a><\/strong><\/p>\n<p>&nbsp;<\/p>\n<p><strong><em>Reference: <\/em><\/strong><a href=\"http:\/\/www.onlinetechvision.com\/?p=658\">TaskletStep Oriented Processing in Spring Batch<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> Eren Avsarogullari at the <a href=\"http:\/\/www.onlinetechvision.com\/\">Online Technology Vision<\/a> blog.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 \u2018TaskletStep Oriented\u2019 and \u2018Chunk Oriented\u2019 processing style. In this article, TaskletStep Oriented Processing &hellip;<\/p>\n","protected":false},"author":158,"featured_media":240,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[30,691],"class_list":["post-4437","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-spring","tag-spring-batch"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TaskletStep Oriented Processing in Spring Batch<\/title>\n<meta name=\"description\" content=\"Many enterprise applications require batch processing to process billions of transactions every day. These big transaction sets have to be processed\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TaskletStep Oriented Processing in Spring Batch\" \/>\n<meta property=\"og:description\" content=\"Many enterprise applications require batch processing to process billions of transactions every day. These big transaction sets have to be processed\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2012-12-04T20:00:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Eren Avsarogullari\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Eren Avsarogullari\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html\"},\"author\":{\"name\":\"Eren Avsarogullari\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/65e6e57c730ae5ade3adbadd483553bd\"},\"headline\":\"TaskletStep Oriented Processing in Spring Batch\",\"datePublished\":\"2012-12-04T20:00:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html\"},\"wordCount\":692,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"keywords\":[\"Spring\",\"Spring Batch\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html\",\"name\":\"TaskletStep Oriented Processing in Spring Batch\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"datePublished\":\"2012-12-04T20:00:39+00:00\",\"description\":\"Many enterprise applications require batch processing to process billions of transactions every day. These big transaction sets have to be processed\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"spring-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/12\\\/taskletstep-oriented-processing-in-spring-batch.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"TaskletStep Oriented Processing in Spring Batch\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/65e6e57c730ae5ade3adbadd483553bd\",\"name\":\"Eren Avsarogullari\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d90f2a1d9c2144dd49935d6c84d5c3aa0832793a522148f397bda79bd8e04c16?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d90f2a1d9c2144dd49935d6c84d5c3aa0832793a522148f397bda79bd8e04c16?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d90f2a1d9c2144dd49935d6c84d5c3aa0832793a522148f397bda79bd8e04c16?s=96&d=mm&r=g\",\"caption\":\"Eren Avsarogullari\"},\"sameAs\":[\"http:\\\/\\\/www.onlinetechvision.com\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Eren-Avsarogullari\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TaskletStep Oriented Processing in Spring Batch","description":"Many enterprise applications require batch processing to process billions of transactions every day. These big transaction sets have to be processed","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html","og_locale":"en_US","og_type":"article","og_title":"TaskletStep Oriented Processing in Spring Batch","og_description":"Many enterprise applications require batch processing to process billions of transactions every day. These big transaction sets have to be processed","og_url":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2012-12-04T20:00:39+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","type":"image\/jpeg"}],"author":"Eren Avsarogullari","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Eren Avsarogullari","Est. reading time":"19 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html"},"author":{"name":"Eren Avsarogullari","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/65e6e57c730ae5ade3adbadd483553bd"},"headline":"TaskletStep Oriented Processing in Spring Batch","datePublished":"2012-12-04T20:00:39+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html"},"wordCount":692,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","keywords":["Spring","Spring Batch"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html","url":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html","name":"TaskletStep Oriented Processing in Spring Batch","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","datePublished":"2012-12-04T20:00:39+00:00","description":"Many enterprise applications require batch processing to process billions of transactions every day. These big transaction sets have to be processed","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","width":150,"height":150,"caption":"spring-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2012\/12\/taskletstep-oriented-processing-in-spring-batch.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"TaskletStep Oriented Processing in Spring Batch"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/65e6e57c730ae5ade3adbadd483553bd","name":"Eren Avsarogullari","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d90f2a1d9c2144dd49935d6c84d5c3aa0832793a522148f397bda79bd8e04c16?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d90f2a1d9c2144dd49935d6c84d5c3aa0832793a522148f397bda79bd8e04c16?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d90f2a1d9c2144dd49935d6c84d5c3aa0832793a522148f397bda79bd8e04c16?s=96&d=mm&r=g","caption":"Eren Avsarogullari"},"sameAs":["http:\/\/www.onlinetechvision.com\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Eren-Avsarogullari"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/4437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/158"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=4437"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/4437\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/240"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=4437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=4437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=4437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}