使用Spring Batch处理错误和控制中断

时间:2013-11-25 08:25:06

标签: spring-batch

我几乎已经完成了Spring Batch的工作,它正在工作,但我遇到了处理错误的问题。我将举一个简单的例子:

我读了一个平面文件,我(稍后)用3个变量映射:

ID CODE   NAME
AAA3333333Alex
AAA3333333Mark
BBB4444444Paul

我希望读者阅读带有控制中断的平面文件(我不知道它是否是英文中的正确术语,意大利语中的内容类似于“密钥中断”):我读取了具有相同ID的元素和代码,只有当密钥更改后才会将它们返回给读者:

while ((line = (Person) peek()) != null) {  //while there are elements to read
 if (line.getId().equals(prevElement.getId()) && line.getCode().equals(prevElement.getCode())
    //do something
}

这很好用:当ID或CODE更改时,我将元素返回给编写器。 为了完成这项工作,我必须从应用程序上下文中将commit-interval设置为1。问题是,在最坏的情况下,如果每行的元素不同,我会提交每一个元素,它变得非常慢。

所以我说:让我们放一个外部控制。每次密钥更改时,我都不会将元素返回给编写器,而是将它们放入列表中,然后每隔200次更改返回列表(如...手工提交间隔):

while (controlBreakCount < 200 &&) {
  while (!exit && (line = (Person) peek()) != null) {  //while there are elements to read
    if (line.getId().equals(prevElement.getId()) && line.getCode().equals(prevElement.getCode())
        //do something
    else { //if the key changes
        //there is a controlBreakCount++;  to increase the count
      //add the elements to a list
    }    
  }
}
return the list

这也有效(真正的代码有更多的控件,但这是以简单的方式解释)。 问题出现在这里:在这种情况下如何使用侦听器处理错误。使用外部而我已经放置(带有controlBreakCount的那个),如果200个元素中的一个有错误,则列表中当前的所有元素都会转到监听器,因此很难识别带有错误的元素。 / p>

我想我的解决方案不是处理“控制中断”的最佳方法,但是我找不到太多关于这一点(而且我对Spring Batch不是很专业)...我可以帮忙吗? ?

非常感谢:)

1 个答案:

答案 0 :(得分:2)

在您的代码中执行某些事情&#39; 是可疑的......:/您对刚才读取的元素执行了哪些操作?在读者中,您只应聚合项目并将其传递给处理者或作者 恕我直言,你必须设置一个大于1的commit-interval来加快进程,并尝试在你自己的自定义阅读器中使用相同的ID + CODE键对数据进行分组,然后以这种方式传递给编写者:

class PersonList {
   String id;
   String code;
   List<Person> persons = new ArrayList<Person>();
}

当您发现密钥破解(ID + CODE与以前不同)时,您必须创建一个新的PersonList对象,直到ID + CODE与上一行添加到当前PersonList.person列表相同。<登记/> 如果您的问题是关于使用我的解决方案管理单行错误,您可以在阅读器中进行管理,如果需要,也可以在阅读器中跳过具有相同ID + CODE的项目。
您的读者必须将其签名更改为MyPersonItemReader<PersonList>,您的作者将编写PersonList个对象,但您可以控制对象(使用ID + CODE)。

我希望我能正确理解你的问题。