所以两部分问题。
首先,我最近在一个Spring批处理作业的监听器中遇到错误。这项工作正在处理2000条记录,并成功处理了1790条记录。侦听器在遇到异常并且失败之前仅处理了大约100条记录。除了记录并以
开头的同一异常外,在记录的作业中没有任何其他异常2018-01-10 15:21:24.798 ERROR 16416 --- [pool-5-thread-7] o.s.batch.core.job.AbstractJob:afterStep回调中遇到异常
杀死侦听器的异常是否可能在完成处理/提交剩余的210条记录之前停止了该作业?它似乎没有多大意义,但我不确定还有什么能够导致那些记录没有被提交。
其次,弹出批量读取输入文件的顺序是什么?上述场景中的210条记录是文件中的第210条记录。我想知道是不是因为春季批次从最后一行读到第一行的文件,这可以解释为什么那些是没有得到处理的记录。
答案 0 :(得分:0)
首先,处理逻辑也应该用Tasklet,ItemReader,ItemWriter和ItemProcessor编写。仅当您要在该步骤之前/之后执行某些操作时,才应使用侦听器。应该使用侦听器在步骤之间传递信息,或者如果您要保存信息或调用不属于批处理的其他系统来通知步骤已完成,则使用
。 Spring批处理源代码,在其中调用侦听器。如果您检查AbstracStep
try {
// Update the step execution to the latest known value so the
// listeners can act on it
exitStatus = exitStatus.and(stepExecution.getExitStatus());
stepExecution.setExitStatus(exitStatus);
exitStatus = exitStatus.and(getCompositeListener().afterStep(stepExecution));
}
catch (Exception e) {
logger.error(String.format("Exception in afterStep callback in step %s in job %s", name, stepExecution.getJobExecution().getJobInstance().getJobName()), e);
}
它只是捕获异常并继续前进。不知道为什么要用这种方式处理它。
如果您仍然希望Spring批处理在侦听器失败的情况下中止,那么您所需要做的就是在侦听器中捕获Exception并编写以下代码
public class YourListener implements StepExecutionListener{
@Override
public ExitStatus afterStep(StepExecution stepExecution){
try{
yourcode ///////
}catch(Exception e){
//log your error
stepExecution.status(BatchStatus.FAILED);
stepExecution.addFailureException(e);
return ExistStatus.FAILED.addDescription(e);
}
return ExitStatus.COMPLETED;
}
我知道这是一种奇怪/错误的方式。但是,如果您没有捕获到异常,Spring批处理将为您完成该操作,然后进行记录。它将继续前进而不会中止/停止批处理执行。