对于我的一个要求,我必须按顺序处理多个文件 . 为了处理文件,我创建了一个名为“fileProcStep1”的步骤(其中包含阅读器,处理器,编写器) . 我需要按顺序重复调用同一步骤来处理每个文件 . 为了实现它,我使用了spring batch decider并且配置了XML . 当我测试批处理时,我看到已经调用了步骤,控件进入编写器并进行处理 . 发布哪个,我的期望是,控件应该转到Decider类,这样根据我的决策逻辑,我可以决定是否应该再次调用相同的步骤 .

但是控制还没有达到Decider级别 . 我不知道为什么会这样 . 我应该在writer类中设置任何状态代码,以便调用decider类吗?有人可以帮助我吗?以下是我的代码片段 .

下面的代码段显示了具有决策标签的作业 . ApplicationContext.xml -----------------

<batch:job id="cmpgnFileProcessorJob">
            <batch:step id="fileProcStep1" next="fileProcessDecision"> 
                <batch:tasklet transaction-manager="transactionManager">
                    <batch:chunk reader="campaignFileProcReader" 
            processor="cmpgnFileProcProcessor"
                        writer="cmpgnFileProcWriter" commit-interval="1"> 
                    </batch:chunk>
                </batch:tasklet>
                <batch:listeners>
                    <batch:listener ref="cmpgnFileProcStepListener"> 
    </batch:listener>
                </batch:listeners>
            </batch:step>
            <batch:decision id="fileProcessDecision" decider="campaignFileProcDecider">
                <batch:next on="CONTINUE" to="fileProcStep1"/>
            </batch:decision>

            <batch:listeners>
                <batch:listener ref="cmpgnFileProcJobListener"></batch:listener>
            </batch:listeners>

            </batch:job>

        <bean id="campaignFileProcDecider" 
        class="com.ent.giftcards.batch.decider.CampaignFileProcDecider"></bean>
    <bean id="campaignFileProcReader" 
    class="com.ent.giftcards.batch.readers.CampaignFileProcReader" 
    scope="step"/>
    <bean id="cmpgnFileProcProcessor" 
    class="com.ent.giftcards.batch.processors.CmpgnFileProcProcessor" 
    scope="step"/>
    <bean id="cmpgnFileProcWriter" 
    class="com.ent.giftcards.batch.writers.CmpgnFileProcWriter" scope="step"/>

Decider类实现如下 . 在这里,我只是检查退出状态代码 . 基于此,我将返回相应的FlowExecutionStatus .

CampaignFileProcDecider.java:

public class CampaignFileProcDecider implements JobExecutionDecider {

            @Override
            public FlowExecutionStatus decide(final JobExecution jobExecution, final StepExecution stepExecution) {
                System.out.println("Inside Decider !!!!!!");
                final ExitStatus status = stepExecution.getExitStatus();

                if (ExitStatus.COMPLETED.equals(status)) {
                    return new FlowExecutionStatus("FINISHED");
                } else if (ExitStatus.EXECUTING.equals(status)) {
                    final Integer count = (Integer) stepExecution.getJobExecution().getExecutionContext()
                            .get(BatchConstants.STEP_INCREMENT_COUNT);
                    stepExecution.getJobExecution().getExecutionContext().put(BatchConstants.STEP_INCREMENT_COUNT, count + 1);
                    return new FlowExecutionStatus("CONTINUE");
                }
                return null;

            }