在Spring Batch中重新启动作业时,它不应重新启动已完成的步骤 . 但同样的事情并没有发生在我的情况下 .

在下面的代码片段中,myTasklet2依赖于myTasklet1 . 而这两个和myTasklet3并行运行 . 在第一次运行中,myTasklet1失败,因此myTasklet2也失败了 . 但myTasklet3成功了 . 当我再次运行作业时,它应该只运行myTasklet1和myTasklet2 . 但它也运行myTasklet3 .

任何人都可以帮我弄清楚我是否犯了任何错误?

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch" 
xmlns:task="http://www.springframework.org/schema/task"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/batch
    http://www.springframework.org/schema/batch/spring-batch-2.2.xsd
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">


<bean id="myTasklet1" class="com.flow.test.MyTasklet1" />  

<bean id="myTasklet2" class="com.flow.test.MyTasklet2" />  

<bean id="myTasklet3" class="com.flow.test.MyTasklet3" />  

<!-- bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="25" />                  
    <property name="maxPoolSize" value="25" />        
</bean-->

<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>

    <batch:job id="myCustomJob1" restartable="false">  
         <batch:step id="step1" next="step2">  
              <batch:tasklet transaction-manager="transactionManager" ref="myTasklet1" allow-start-if-complete="false">  
              </batch:tasklet>  
         </batch:step>  
         <batch:step id="step2">  
              <batch:tasklet transaction-manager="transactionManager" ref="myTasklet2" allow-start-if-complete="false">  
              </batch:tasklet>  
         </batch:step>  
    </batch:job>    
    <batch:job id="myCustomJob2" restartable="false">  
         <batch:step id="step3">  
              <batch:tasklet transaction-manager="transactionManager" ref="myTasklet3" allow-start-if-complete="false">  
              </batch:tasklet>  
         </batch:step>  
    </batch:job>    

<batch:job id="myCustomJob" job-repository="jobRepository" parent="simpleJob" restartable="false">  
    <batch:split id="preprocessingStep" task-executor="taskExecutor">
        <batch:flow>
            <batch:step id="stepflow1" allow-start-if-complete="false">
                <batch:job ref="myCustomJob1" />
            </batch:step>
        </batch:flow>
        <batch:flow>
            <batch:step id="stepflow2" allow-start-if-complete="false">
                <batch:job ref="myCustomJob2" />
            </batch:step>
        </batch:flow>
    </batch:split>
</batch:job>
public class MyTasklet1 implements Tasklet {

@Override
public RepeatStatus execute(StepContribution contribution,
        ChunkContext chunkContext) throws Exception {

    String s = "This is an output";

    chunkContext.getStepContext().getStepExecution().getJobExecution()
            .getExecutionContext().put("outputString", s);

    System.out.println("Inside MyTasklet1");

    File f = new File(
            "C:/MyProject/SpringBatchExampleNew/src/main/resources/marker");

    if (f.exists()) {
        System.out.println("File found");
        return RepeatStatus.FINISHED;
    } else {
        System.out.println("File not found");
        throw new Exception("File not found");
    }

}}

public class MyTasklet2 implements Tasklet {

private String output;

public String getOutput() {
    return output;
}

public void setOutput(String output) {
    this.output = output;
}

@Override
public RepeatStatus execute(StepContribution contribution,
        ChunkContext chunkContext) throws Exception {

    setOutput((String) chunkContext.getStepContext().getStepExecution()
            .getJobExecution().getExecutionContext().get("outputString"));

    Thread.sleep(500);
    System.out.println("Inside MyTasklet2");
    System.out.println("Output string is: " + output);

    return RepeatStatus.FINISHED;
}}

public class MyTasklet3 implements Tasklet {

private String output;

public String getOutput() {
    return output;
}

public void setOutput(String output) {
    this.output = output;
}

@Override
public RepeatStatus execute(StepContribution contribution,
        ChunkContext chunkContext) throws Exception {

    setOutput((String) chunkContext.getStepContext().getStepExecution()
            .getJobExecution().getExecutionContext().get("outputString"));

    System.out.println("Inside MyTasklet3");
    System.out.println("Output string is: " + output);

    return RepeatStatus.FINISHED;

}}