Я унаследовал задание Spring Batch и пытаюсь понять следующее поведение.
Исключение было выброшено в configIBMTCompletionProcessor (ConfigIBMTCompletionProcessor.java)
шага VerifyPreditErrors, и я ожидаю, что работа остановится в соответствии с определением шага.
Потому что выброшенное исключение ConfigIBMTCompletionProcessor.java должно привести к тому, что afterStep() в ConfigIBMTCompletionWriter.java вернется ExitStatus.NOOP. Таким образом, все пакетное задание должно завершиться.
Но этот шаг был отмечен как ABANDONED и мы перешли к следующему шагу IBMTFileCopy.
<batch:step id = "VerifyPreditErrors">
<batch:tasklet>
<batch:chunk reader = "iinnoOpReader" writer = "compositeIBMTCompletionWriter" processor = "configIBMTCompletionProcessor"
commit-interval = "1">
</batch:chunk>
</batch:tasklet>
<batch:next on = "FAILED" to = "IBMTFileCopy"/>
<batch:next on = "SUCCESS" to = "IBMTFetchDataCreateReport"/>
<batch:end on = "NOOP"/>
<batch:listeners>
<batch:listener ref = "configIBMTCompletionWriter"></batch:listener>
</batch:listeners>
</batch:step>
<batch:step id = "IBMTFileCopy" >
<batch:tasklet ref = "fileCopyTasklet">
</batch:tasklet>
</batch:step>
<bean id = "compositeIBMTCompletionWriter" class = "org.springframework.batch.item.support.CompositeItemWriter" scope = "job">
<property name = "delegates">
<list>
<ref bean = "configIBMTCompletionWriter" /> <!-- This will update the tables if no pre-edit errors, otherwise send an email -->
<ref bean = "flatFileItemWriterWrapper" /> <!-- This will create a file only if pre-edit errors are found. -->
</list>
</property>
</bean>
<bean id = "configIBMTCompletionProcessor" class = "com.companyName.coreconfig.batch.processor.ConfigIBMTCompletionProcessor" />
<bean id = "configIBMTCompletionWriter" class = "com.companyName.coreconfig.batch.writer.IBMTCompletionWriter" scope = "step">
<property name = "fileName" value = "IBMT_ERR_RPT_#{jobParameters[dt]}.csv"/>
</bean>
public class ConfigIBMTCompletionWriter implements ItemWriter<List<CustomParams>>,
StepExecutionListener {
@Override
public void write(List<? extends List<CustomParams>> items) throws Exception {
...
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
logger.info("Setting the step status as: " + status);
if (status.equals(Constants.SUCCESS)) {
return new ExitStatus(Constants.SUCCESS);
} else if (status.equals(Constants.FAILED)) {
return new ExitStatus(Constants.FAILED);
}
return ExitStatus.NOOP;
}
@Override
public void beforeStep(StepExecution stepExecution) {}
}
В журналах я вижу напечатанный журнал afterStep:
335601 main INFO com.companyName.coreconfig.batch.writer.ConfigIBMTCompletionWriter ConfigIBMTCompletionWriter.java:169 Setting the step status as: null
public class ConfigIBMTCompletionProcessor implements
ItemProcessor<String, List<CustomParams>>, StepExecutionListener {
// fetch data from DB
String status = service.fetchBatchWorkStatus();
case (status) {
...
case Constants.FAILED:
throw Exception(...);
...
}
}
@Override
public void beforeStep(StepExecution stepExecution) {
// some pre-processing
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
// TODO Auto-generated method stub
return null;
}
Прилагается изображение с подробными сведениями об этапах пакетного задания:
Почему задание перешло к этапу IBMTFileCopy? Даже когда метод afterStep() в ConfigIBMTCompletionWriter.java вернулся ExitStatus.NOOP.
Почему шаг VerifyPreditErrors отмечен как ЗАБРОШЕННЫЙ?




удалось разобраться.
Есть 2 проблемы:
ExitStatus шага VerifyPreditErrorsbatch:endExitStatus шага VerifyPreditErrorsПоскольку шаг VerifyPreditErrors имеет фрагментарный подход (реализованный с помощью Reader, Processor и Writer), исключение, создаваемое в процессоре (ConfigIBMTCompletionProcessor), означает, что Writer (ConfigIBMTCompletionWriter) не выполняет свою write() логику.
В результате переменная status в ConfigIBMTCompletionWriter.java по-прежнему будет null. Когда ConfigIBMTCompletionWriter.afterStep() запускается, возникает NullPointerException и ExitStatus (batch_step_execution.EXIT_CODE) не обновляется с FAILED на NOOP, как предполагалось.
batch:endШаг VerifyPreditErrors в конфигурации задания (файл XML) был настроен следующим образом:
<batch:step id = "VerifyPreditErrors">
<batch:tasklet>
<batch:chunk reader = "iinnoOpReader" writer = "compositeIBMTCompletionWriter" processor = "configIBMTCompletionProcessor"
commit-interval = "1">
</batch:chunk>
</batch:tasklet>
<batch:next on = "FAILED" to = "IBMTFileCopy"/>
<batch:next on = "SUCCESS" to = "IBMTFetchDataCreateReport"/>
<batch:end on = "NOOP"/>
<batch:listeners>
<batch:listener ref = "configIBMTCompletionWriter"></batch:listener>
</batch:listeners>
</batch:step>
Это означает, что даже если ExitStatus был правильно обновлен до NOOP, пакетное задание завершится со статусом COMPLETED, что неверно в контексте нашей бизнес-логики.