如何在春季批量中跳过读者,作者

时间:2018-02-09 03:25:58

标签: spring spring-batch

我有一个要求,我需要将一些文件上传到服务器。我正在使用弹簧批来完成同样的工作。这里“initializeFile”将基本上与服务器交互,以检查文件是否已存在于服务器中。如果没有那么它应该调用步骤“uploadIndexFileStep”来上传文件。如果文件已存在于服务器中,则不应调用步骤“uploadIndexFileStep”。 如何实现这种情况,如果“initializeFile”没有要上传的文件,那么spring不应该调用下一步“uploadIndexFileStep”。

有没有办法,还是我需要遵循一些设计或弹簧配置更改?任何指针都会有所帮助。

以下是批量配置。

    <batch:step id="initFileStep" next="uploadIndexFileStep">
        <batch:tasklet ref="initializeFile"></batch:tasklet>
    </batch:step>

    <batch:step id="uploadIndexFileStep">
        <batch:tasklet>
            <batch:chunk reader="indexFileReader" processor="indexFileProcessor" writer="indexFileWriter" commit-interval="${app.chunk.commit.interval}"/>
        </batch:tasklet>
    </batch:step> 
    <batch:listeners>
        <batch:listener ref="uploadIndexJobListener"/>
    </batch:listeners>      
</batch:job>

2 个答案:

答案 0 :(得分:1)

Spring批处理提供了处理条件流的好方法。您可以使用ON exists status来实现它。

您可以拥有以下内容

@Bean
public Job job() {
    return jobBuilderFactory().get("job").
            flow(initializeFile()).on("FILELOADED").to(anyStep()).
            from(initializeFile()).on("FILENOTLOADED").to(uploadIndexFileStep()).next(step3()).next(step4()).end().build();
}

5.3.2 Conditional Flow

答案 1 :(得分:0)

我使用JobExecutionDecider解决了这个问题。我在ExecutionContext中维护队列大小,然后在decider中读取此执行上下文以管理流程。

public class UploadIndexFlowDecider implements JobExecutionDecider {
        @Override
        public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
            int queueSize = jobExecution.getExecutionContext().getInt("INDEX_UPLOAD_QUEUE_SIZE");
            if(queueSize > 0)
                return FlowExecutionStatus.COMPLETED;
            else
                return FlowExecutionStatus.STOPPED;
        }

    }


@Component
public class InitializeFileStep implements Tasklet {
@Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
chunkContext.getStepContext().getStepExecution().getJobExecution().getExecutionContext().putInt("INDEX_UPLOAD_QUEUE_SIZE", 1);
return RepeatStatus.FINISHED;
    }



<batch:job id="uploadIndexFileJob">
        <batch:step id="initFileStep" next="uploadDecision">
            <batch:tasklet ref="initializeFile"></batch:tasklet>
        </batch:step>
        <batch:decision id="uploadDecision" decider="uploadIndexDecision">
            <batch:next on="COMPLETED" to="uploadIndexFileStep"/>
            <batch:end on="STOPPED"/> 
        </batch:decision>
        <batch:step id="uploadIndexFileStep">
            <batch:tasklet>
                <batch:chunk reader="indexFileReader" processor="indexFileProcessor" writer="indexFileWriter" commit-interval="${app.chunk.commit.interval}"/>
            </batch:tasklet>
        </batch:step> 
        <batch:listeners>
            <batch:listener ref="uploadIndexJobListener"/>
        </batch:listeners>      
    </batch:job>