Spring-Batch:如何在无效记录中返回自定义退出代码,而弹出批处理中则例外

时间:2017-05-11 16:18:38

标签: java spring spring-mvc spring-batch spring-batch-admin

我有一个弹簧批处理任务,其中我有一些记录有些是有效的,有些在输入文件中无效。在有效记录中,它应该写入输出文件,对于无效记录,它应该写入错误文件从处理器抛出一些异常。所以问题是什么时候写入错误文件,它应该将退出代码设置为3.我尝试了很多方法,但它无法设置退出代码。它甚至终止该记录的实例当异常发生时,它不会调用writer。

1 个答案:

答案 0 :(得分:0)

您可能不想在此处使用例外。作为一般经验法则,最好避免使用预期业务逻辑的异常。相反,如果记录有效,请考虑使用ItemProcessor返回GoodObject(或原始项目),如果记录无效,则考虑使用BadObject

然后,利用ClassifierCompositeItemWriter将好记录发送到一个文件ItemWriter,将坏记录发送到错误文件ItemWriter

最后,有很多方法可以确定是否遇到任何“坏”记录。一种简单的方法是在您的boolean中添加一个类级别ItemProcessor,然后利用StepExecutionListener afterStep挂钩检查该标志并设置ExitCode

public class ValidatingItemProcessor implements ItemProcessor<Input, AbstractItem>, StepExecutionListener {

    private boolean itemFailed = false;

    @Override
    public AbstractItem process(final Input item) throws Exception {
        if (item.isValid()) {
            return new GoodItem();
        }
        itemFailed = true;
        return new BadItem();
    }

    @Override
    public void beforeStep(final StepExecution stepExecution) {
        //no-op
    }

    @Override
    public ExitStatus afterStep(final StepExecution stepExecution) {
        if (itemFailed) {
            return new ExitStatus("3");
        }
        return null;
    }
}