Я столкнулся с проблемой ниже в одном из рабочих заданий Spring.Ниже работа на высоком уровне.
<job id="SomeJobId">
<step id="preValidationStep">
<tasklet ref="someTaskLetRef"/>
<next on="COMPLETED" to="actualStepId"/>
<end on="NO-OP"/>
</step>
<!-- this step runs in a loop -->
<step id="actualStepId" next="limitDeciderStep">
<tasklet>
<chunk reader="reader" processor="processor"
writer="writer" commit-interval="1">
</chunk>
<listeners>
<listener ref="ItemWriterStepExecutionListener"/>
</listeners>
</tasklet>
</step>
<!-- this is limit decider -->
<decision id="limitDeciderStep" decider="limitDeciderBean">
<next on="CONTINUE" to="actualStepId" />
<end on="COMPLETED" />
</decision>
</job>
Код писателя добавлен здесь:
public class ItemWriter implements ItemWriter<Record>,StepExecutionListener{
private List<Record> records ; // it holds all records to process in afterStep
public ItemWriter() {
super();
}
@Override
public void write(List<? extends Record> recepients) throws Exception {
// this is do nothing method
// It just accumulates records and stores in Writer like record.add();
}
@override
public ExitStatus afterStep(StepExecution stepExecution) {
try{
// do some processong for all the records accumulated
return new ExitStatus("SUCCESS");
}catch(Exception ex){
// we want to get exception trace printed here by Spring Batch framework
// throwing exception is not helping here . LoopDecider gets called and status is COMPLETED
//If ExitStatus("FAILED") is used , Job status is FAILED , but we loose the exception stack trace as no exception is thrown .
return new ExitStatus("FAILED");
}
}
@override
public void beforeStep(StepExecution stepExecution){
//initliase records
records = new ArrayList<String>();
}
}
Как показано в коде высокого уровня выше -
1) actualStepId выполняется в цикле
2) Логика цикла определяется limitDeciderStep
Проблема: 1) Даже когда actualStepId Шаг бросков ЛЮБОЕ ИСКЛЮЧЕНИЕ (я кидаю от писателя), limitDeciderStep всегда работает
2) В идеале, limitDeciderStep не должен запускаться, а задание должно прекращаться
3) Но этого не происходит, и Spring Batch игнорирует выброшенное исключение, а limitDeciderStep всегда выполняется
4) Задание всегдапереходит в полное состояние независимо от того, какое исключение выдается.Он завершается только тогда, когда LoopDecider получает шаг к завершению
Есть ли какой-нибудь способ, которым мы можем выполнить верхнее задание при возникновении исключения и предотвратить imitDeciderStep работает?
РЕДАКТИРОВАТЬ:
Я удалил LoopDecider в целом, но наблюдается то же поведение.Задание не переходит в состояние FAILED , даже когда исключение выдается из Writer afterStep Метод ItemWriterStepExecutionListener является StepexecutionListener, предоставленным в классе Writer
Исключение выдается из Writer afterStep , поскольку я выполняю всю окончательную обработку в Writer afterStep .
Ниже приведен псевдокод.
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
try{
//do some processing
}catch(Exception ex){
throw new RunTimeException(ex);
}
}
Задание не переходит в состояние сбоя из-за исключения исключения из afterStep ?
РЕДАКТИРОВАТЬ 2: После дальнейшего анализа я обнаружил следующие вещи:
1) Я возвратил статус выхода как FAILED из afterStep
метода,После этого LoopDecider
не вызывается.Он вызывался раньше, так как статус не установлен как FAILED
2) Но в этом случае, даже когда ExitStatus не работает, весенний пакет не показывает ошибку на консоли, так как мы невыдает любые исключения, но возвращает ExitStatus.
3) Проблема по-прежнему заключается в том, как получить статус задания как СБОЙ, но с сообщением об исключении журнала Spring Batch в его контексте