我几乎已经完成了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不是很专业)...我可以帮忙吗? ?
非常感谢:)
答案 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)。
我希望我能正确理解你的问题。