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

Spring batch 使用Spring Batch处理错误和控制中断,spring-batch,Spring Batch,我几乎完成了SpringBatch的工作,它正在工作,但是我在处理错误时遇到了问题。我将举一个简单的例子: 我阅读了一个平面文件,我(稍后)将其映射为3个变量: ID CODE NAME AAA3333333Alex AAA3333333Mark BBB4444444Paul 我希望读者阅读带有控制中断的平面文件(我不知道它在英语中是否是正确的术语,在意大利语中它类似于“keybreak”):我读取具有相同ID和代码的元素,并且仅当键更改将它们返回给读者时: while ((line =

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

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

ID CODE   NAME
AAA3333333Alex
AAA3333333Mark
BBB4444444Paul
我希望读者阅读带有控制中断的平面文件(我不知道它在英语中是否是正确的术语,在意大利语中它类似于“keybreak”):我读取具有相同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或代码更改时,我将元素返回给编写器。 为了实现这一点,我必须从应用程序上下文中将提交间隔设置为1。问题是,在最坏的情况下,如果每一行的元素不同,我提交每一个元素,它会变得非常慢

所以我说:让我们设置一个外部控制。我没有在每次键更改时将元素返回给编写器,而是将它们放在一个列表中,然后每隔200个键更改返回一个列表(如…手工提交间隔):

while(controlBreakCount<200&&){
while(!exit&&(line=(Person)peek())!=null){//当存在要读取的元素时
if(line.getId().equals(preveElement.getId())&&line.getCode().equals(preveElement.getCode())
//做点什么
否则{//如果键更改
//有一个controlBreakCount++;用于增加计数
//将元素添加到列表中
}    
}
}
返回列表
这也是可行的(真正的代码有更多的控件,但这是用一种简单的方式来解释的)。 这里的问题是:在这种情况下,如何处理侦听器的错误。在我放置的外部元素(带有controlBreakCount的元素)中,如果200个元素中有一个有错误,那么列表中当前的所有元素都会转到侦听器,因此很难识别有错误的元素

我想我的解决方案不是处理“控制中断”的最佳方法,但我找不到太多关于这一点的信息(而且我对SpringBatch不是很专业)…我能得到一些帮助吗

非常感谢:)

您的代码中的“做点什么”是可疑的…:/对刚读取的元素执行哪些操作?在reader中,您应该只聚合项目并将其传递给处理者或写入者。
IMHO您必须将
提交间隔设置为大于1,以加快处理速度,并尝试在您自己的自定义读卡器中使用相同的ID+代码密钥对数据进行分组,然后以以下方式传递给编写器:

class PersonList {
   String id;
   String code;
   List<Person> persons = new ArrayList<Person>();
}
class个人列表{
字符串id;
字符串代码;
List persons=new ArrayList();
}
当您发现一个按键中断(ID+代码与以前不同)时,您必须创建一个新的PersonList对象,直到ID+代码与前一行相同,才能添加到当前PersonList.person列表中。
如果您的问题是关于使用“我的解决方案”管理单行错误,您可以在读卡器中进行管理,如果需要,还可以跳过读卡器中具有相同ID+代码的项目。
您的阅读器必须将其签名更改为
mypersonimreader
,您的写入者将写入
PersonList
对象,但您可以控制该对象(ID+code)


我希望我正确理解了您的问题。

是的,您理解正确,问题是我传递给作者的结构(不正确)。现在按照您的建议,返回的对象更加“可理解”,提交间隔工作正常:)非常感谢您的帮助!!!!!祝你今天愉快:)
class PersonList {
   String id;
   String code;
   List<Person> persons = new ArrayList<Person>();
}