许多企业应用程序需要批处理才能每天处理数十亿笔交易。 必须处理这些大事务集,而不会出现性能问题。 Spring Batch是一个轻量级且强大的批处理框架,用于处理这些大数据集。
Spring Batch提供了“面向TaskletStep”和“面向块”的处理风格。 在本文中,解释了面向TaskletStep的处理模型。
让我们研究基本的Spring Batch组件:
职位:
封装整个批处理过程的实体。 步骤和任务集在作业下定义
步 :
封装批处理作业的独立顺序阶段的域对象。
JobInstance:
批处理域对象代表一个唯一可识别的作业运行-它的标识由Job和JobParameters对提供。
JobParameters:
值对象,代表批处理作业的运行时参数。
工作执行:
JobExecution指的是一次尝试运行Job的技术概念。 执行可能以失败或成功结束,但是与给定执行相对应的JobInstance不会被视为完成,除非执行成功完成。
JobRepository:
一个接口,负责批处理元数据实体的持久性。 在以下示例中,通过MapJobRepositoryFactoryBean使用内存中的存储库。
JobLauncher:
公开运行方法的接口,该方法启动并控制定义的作业。
TaskLet:
暴露执行方法的接口,该方法将被反复调用,直到它返回RepeatStatus.FINISHED或引发异常以指示失败。 当以下示例不要求读者和作家时使用它。
让我们看一下如何开发面向Tasklet步骤的处理模型。
二手技术:
- JDK 1.7.0_09
- Spring3.1.3
- Spring批次2.1.9
- Maven的3.0.4
步骤1:建立已完成的专案
创建一个Maven项目,如下所示。 (可以使用Maven或IDE插件来创建它)。
步骤2:图书馆
首先,将依赖项添加到Maven的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插件)用于使用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>
以下Maven插件可用于创建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>
步骤3:创建成功的StepTasklet任务表
通过实现Tasklet接口来创建SuccessStepTasklet。 它成功地说明了业务逻辑。
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;
}
}
步骤4:创建失败的StepTasklet任务
通过实现Tasklet接口创建FailedStepTasklet。 它说明了失败步骤中的业务逻辑。
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;
}
}
步骤5:创建BatchProcessStarter类
创建BatchProcessStarter类以启动作业。 此外,它记录他们的执行结果。 无法使用相同的参数重新启动已完成的作业实例,因为该作业实例已经存在于作业存储库中,并且JobInstanceAlreadyCompleteException抛出并带有“作业实例已经存在且已完成”说明。 可以使用其他参数重新启动。 在以下示例中,设置了不同的currentTime参数以重新启动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;
}
}
步骤6:创建applicationContext.xml
Spring配置文件applicationContext.xml已创建。 它涵盖了Tasklet和BatchProcessStarter定义。
<?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>
步骤7:创建jobContext.xml
Spring配置文件jobContext.xml已创建。 乔布斯的流程如下:
FirstJob的流程:
1)开始第一步。
2)FirstStep以COMPLETED状态完成后,SecondStep开始。
3)SecondStep以COMPLETED状态完成后,将启动ThirdStep。 4)在以COMPLETED状态完成ThirdStep之后,以COMPLETED状态完成FirstJob执行。
SecondJob的流程:
1)第四步开始。
2)在以COMPLETED状态完成第四步之后,开始第五步。
3)在完成状态为FifthStep之后,以完成状态完成SecondJob执行。
ThirdJob的流程:
1)第六步开始。
2)在完成状态为SixthStep之后,将启动SeventhStep。
3)在SeventhStep以FAILED状态完成后,ThirdJob执行在FAILED状态下完成。
FirstJob的流程与第一次执行相同。
<?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>
步骤8:建立应用程式类别
创建应用程序类以运行应用程序。
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();
}
}
步骤9:建立专案
构建OTV_SpringBatch_TaskletStep_Oriented_Processing项目后,将创建OTV_SpringBatch_TaskletStep-0.0.1-SNAPSHOT.jar 。
步骤10:运行项目
运行创建的OTV_SpringBatch_TaskletStep-0.0.1-SNAPSHOT.jar文件后,将显示以下控制台输出日志:
First Job的控制台输出:
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的控制台输出:
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的控制台输出:
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的控制台输出:
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]]
步骤11:下载
https://github.com/erenavsarogullari/OTV_SpringBatch_TaskletStep
相关链接 :
Spring Batch –参考文档
Spring Batch – API文档
参考: Online Technology Vision博客上的JCG合作伙伴 Eren Avsarogullari提供的Spring Batch中面向TaskletStep的处理 。
翻译自: https://www.javacodegeeks.com/2012/12/taskletstep-oriented-processing-in-spring-batch.html