Spring Batch将某些记录写入不同的文件重启问题

时间:2014-08-04 21:16:15

标签: spring-batch

我有一个Spring Batch作业,它从一个文件中读取并写入两个平面文件(格式不同)。它使用CompositeWriter,它有两个委托,它们是扩展FlatFileItemWriter的自定义类。每个作者只写一些记录。例如,使用14个输入记录,GoodFileWriter将写入12条记录,而SkipFileWriter将只写入两条记录。这很好用。但是,如果作业在中间失败并且我重新启动它,那么好的文件会丢失记录。看起来Spring Batch只维护其中一个文件的文件大小/记录数。如果需要,我很乐意提供示例。

我不得不相信这只是因为我对Spring Batch的无能,所以任何指针都会受到高度赞赏。

谢谢

2 个答案:

答案 0 :(得分:0)

如果没有看到你的代码,我只猜猜SB不会保存所有两个流的状态,只能保存一个。
你必须使用'streams'元素手动注册所有要编写的流。在official doc中 只是一个建议:你写道你为自定义编写者扩展了FlatFileItemWriter。使用SB,最好的解决方案 - 可能 - 是使用委托而不是扩展。如果您可以使用ItemStreamItemWriter重写代码或使用复合超类AbstractItemStreamItemWriter

,请检查您的代码

答案 1 :(得分:0)

自注册流以来,扩展FlatFileItemWriter并使用文件编写器委托实现ItemStream和ItemWriter不起作用,这就是我想出的答案。我唯一地设置了作者的name属性;或者在Java类的构造函数中,或者在编写器的XML定义中。此方法可以扩展FlatFileItemWriter,也可以使用使用FlatFileItemWriter委托实现ItemStream和ItemWriter的自定义编写器。 name属性来自ItemStreamSupport抽象类。

Spring Batch将写入文件的数量存储在name.written键下的执行上下文中。 FlatFileItemWriter的默认名称是FlatFileItemWriter。由于我有两个FlatFileItemWriters,因此只有一个项写入执行上下文。由于一个文件写入的文件多于重新启动时发生的其他损坏。唯一命名的作者解决了这个问题。如果有更合适的方法来处理这个问题,我将不胜感激。

感谢Luca Basso Ricci指出我关于Spring Batch没有为两个流保存状态的评论这个方向。