Spring-批处理:如何 return 在无效记录上自定义退出代码,在 spring 批处理中出现异常
Spring-Batch : How do I return custom exit code on invalid record with exception in spring batch
我有一个 spring 批处理任务,其中输入的记录很少,有些是有效的,有些是无效的 file.On 有效记录,它应该写入输出文件,对于无效记录记录,它应该写入错误文件并从 processor.So 抛出一些异常问题是当某些东西被写入错误文件时它应该将退出代码设置为 3.I 已经尝试了很多方法但它无法set exit code.It 甚至在发生异常时终止该记录的实例,因此它不会调用 writer.
您可能不想在这里使用异常。作为一般经验法则,最好避免对预期的业务逻辑使用异常。相反,如果记录有效,请考虑简单地使用 ItemProcessor
到 return 和 GoodObject
(或原始项目),如果记录无效,则使用 BadObject
。
然后,利用 ClassifierCompositeItemWriter
将好的记录发送到一个文件 ItemWriter
,将坏的记录发送到错误文件 ItemWriter
。
最后,有多种方法可以确定是否遇到任何 "bad" 记录。一种简单的方法是在你的 ItemProcessor
中放置一个 class 级别的 boolean
,然后利用 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;
}
}
我有一个 spring 批处理任务,其中输入的记录很少,有些是有效的,有些是无效的 file.On 有效记录,它应该写入输出文件,对于无效记录记录,它应该写入错误文件并从 processor.So 抛出一些异常问题是当某些东西被写入错误文件时它应该将退出代码设置为 3.I 已经尝试了很多方法但它无法set exit code.It 甚至在发生异常时终止该记录的实例,因此它不会调用 writer.
您可能不想在这里使用异常。作为一般经验法则,最好避免对预期的业务逻辑使用异常。相反,如果记录有效,请考虑简单地使用 ItemProcessor
到 return 和 GoodObject
(或原始项目),如果记录无效,则使用 BadObject
。
然后,利用 ClassifierCompositeItemWriter
将好的记录发送到一个文件 ItemWriter
,将坏的记录发送到错误文件 ItemWriter
。
最后,有多种方法可以确定是否遇到任何 "bad" 记录。一种简单的方法是在你的 ItemProcessor
中放置一个 class 级别的 boolean
,然后利用 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;
}
}