Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring批处理中创建迭代流步骤_Java_Spring_Spring Batch - Fatal编程技术网

Java 在Spring批处理中创建迭代流步骤

Java 在Spring批处理中创建迭代流步骤,java,spring,spring-batch,Java,Spring,Spring Batch,我在做一个流动步骤,他需要在不同的时刻重复相同的步骤。在我们完成RepeatStatus.FINISHED之前,它不会重复相同的步骤,但在其他一些步骤之后,会转到上一个步骤。我们已经做了一个简化模型来尝试它,但它也不起作用 Job.xml: <job id="job1" xmlns="http://www.springframework.org/schema/batch"> <step id="job1Step1" next="decision1">

我在做一个流动步骤,他需要在不同的时刻重复相同的步骤。在我们完成RepeatStatus.FINISHED之前,它不会重复相同的步骤,但在其他一些步骤之后,会转到上一个步骤。我们已经做了一个简化模型来尝试它,但它也不起作用

Job.xml:

<job id="job1" xmlns="http://www.springframework.org/schema/batch"> 
    <step id="job1Step1" next="decision1"> 
        <tasklet ref="tasklet1" />  
    </step> 

    <decision id="decision1" decider="decider1">
        <next on="1" to="job1Step1"/>
        <next on="2" to="job1Step2"/>
        <next on="3" to="job1Step3"/>
    </decision>

    <step id="job1Step2" next="decision2"> 
        <tasklet ref="tasklet2" />  
    </step>

    <decision id="decision2" decider="decider2">
        <next on="1" to="job1Step1"/>
        <next on="2" to="job1Step2"/>
        <next on="3" to="job1Step3"/>
    </decision>

    <step id="job1Step3" next="job1Step1"> 
        <tasklet ref="tasklet3" />  
    </step>
</job>
决策类模型:

public class TaskletN implements Tasklet {

    protected static Log log = LogFactory.getLog(TaskletN.class);

    @Override
    public RepeatStatus execute(StepContribution stepCont, ChunkContext chunkContext) throws Exception {
        log.info("Passo per TASKLET_N");
        return null;
    }

}
public class DeciderM implements JobExecutionDecider {

protected static Log log = LogFactory.getLog(DeciderM.class);

    public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
        String prova = "M+1";
        log.info("Estic a DECIDER_M i vaig al STEP: " + prova);
        return new FlowExecutionStatus(prova);
    }

}
这就是问题所在。第一次没问题,但第二次和其他时间,它直接进入决策者的步骤

Passo per TASKLET_1
Estic a DECIDER_1 i vaig al STEP: 2
Passo per TASKLET_2
Estic a DECIDER_2 i vaig al STEP: 3
Passo per TASKLET_3
Estic a DECIDER_1 i vaig al STEP: 2
Estic a DECIDER_2 i vaig al STEP: 3
Estic a DECIDER_1 i vaig al STEP: 2
Estic a DECIDER_2 i vaig al STEP: 3
Estic a DECIDER_1 i vaig al STEP: 2
... (bug)

中描述了类似的问题

看看我在回答这个问题时的评论:

这是行不通的。SpringBatch不打算在单个作业启动期间多次执行特定步骤。该框架保持步骤及其读写器的几个内部状态。您需要在运行时侵入实例化的作业结构,并以某种方式重置步骤以及读写器的状态。但这是如此丑陋和肮脏的黑客;绝对不是你想做的事


中描述了类似的问题

看看我在回答这个问题时的评论:

这是行不通的。SpringBatch不打算在单个作业启动期间多次执行特定步骤。该框架保持步骤及其读写器的几个内部状态。您需要在运行时侵入实例化的作业结构,并以某种方式重置步骤以及读写器的状态。但这是如此丑陋和肮脏的黑客;绝对不是你想做的事

Passo per TASKLET_1
Estic a DECIDER_1 i vaig al STEP: 2
Passo per TASKLET_2
Estic a DECIDER_2 i vaig al STEP: 3
Passo per TASKLET_3
Estic a DECIDER_1 i vaig al STEP: 2
Estic a DECIDER_2 i vaig al STEP: 3
Estic a DECIDER_1 i vaig al STEP: 2
Estic a DECIDER_2 i vaig al STEP: 3
Estic a DECIDER_1 i vaig al STEP: 2
... (bug)