在弹簧批处理中将一个跳过的项目和错误字段指向一个块

时间:2012-02-21 13:08:35

标签: spring-batch

场景1

跳过侦听器界面如下:

public interface SkipListener<T,S> extends StepListener {
 void onSkipInRead(Throwable t);
 void onSkipInProcess(T item, Throwable t);
 void onSkipInWrite(S item, Throwable t);
}

此界面最适用于记录跳过的项目和错误。

是否可以获取输入中跳过项目的编号。对于例如如果输入中的第10个项目被跳过,我应该能够记录“项目编号10被跳过!”通过上面的倾听者。

我需要这个,因为我输入的文件中行没有任何识别键。因此,只需注销该项目,就无法将项目本身固定在文件中。

如果不是文件,输入是数据库表怎么办?是否有可能获得跳过项目的位置编号?

场景2

我的bean有三个属性,一个,两个和三个(所有字符串),其中通过适当的行映射器从文件中读取输入,然后在一些处理之后数据库表被加载数据。

以下是处理器的代码块:

if(two.charAt(4) == '_')
   { // do some processing }

显然,如果字段2从上面的文件中变为空,则会抛出“字符串索引超出绑定的异常”并将被跳过。

所以,在skip listener中,我想要的是有关抛出错误的列的信息。

这里因为名为two的字段给出了错误,我想要在跳过侦听器中登录的信息就像“属性一丢错”字符串索引超出绑定异常“在行号10”或者如果可能的话,甚至更具体“属性1在第10行中是空的,这对于不了解java术语的业务更有意义。

希望我明白我的怀疑。

感谢阅读!

1 个答案:

答案 0 :(得分:1)

情景1

要获取跳过的项目的行号,请阅读文件,您可以:

  • for onSkipInRead - 实现自己/包装阅读器以处理异常
  • onSkipInProcess - 实现自己的linemapper,它将行号写入item或在步骤上下文中写入当前行号
  • onsKipInWrite - 与onSkipInProcess
  • 相同

要获取跳过的项目的行号,请阅读表格,您可以:

  • for onSkipInRead - 实现自己/包装读取器以处理异常,但我不确定是否可以在此处获取行号,可能只是当前的chunk-start-number
  • onSkipInProcess - 实现自己的rowmapper,它将行号写入item或在步骤上下文中写入当前行号
  • onsKipInWrite - 与onSkipInProcess
  • 相同

场景2

请参阅方案1并在处理器中添加try / catch块,以便抛出自己的异常,例如:有关财产状况的信息,或以类似的方式改变步骤背景