对于我的一个要求,我必须按顺序处理多个文件 . 为了处理文件,我创建了一个名为“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;
}