当前位置: 首页 > 知识库问答 >
问题:

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

西门靖琪
2023-03-14

我有一个Spring批处理作业,它从一个文件读取数据,然后写入两个平面文件(格式不同)。它使用具有两个委托的CompositeWriter,这两个委托是扩展FlatFileItemWriter的自定义类。每个作者只写某些记录。例如,对于14条输入记录,GoodFileWriter将写入12条记录,SkipFileWriter将只写入两条记录。这很好用。但是,如果作业中途失败,我重新启动它,那么好的文件就会丢失记录。Spring Batch似乎只维护其中一个文件的文件大小/记录计数。如果需要,我很乐意提供例子。

我不得不相信,这只是因为我对Spring Batch的无能,所以任何指点都将不胜感激。

谢谢你

共有2个答案

鲍俊杰
2023-03-14

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

Spring Batch将写入文件的数量存储在name.written键下的执行上下文中。FlatFileItemWriter的默认名称是FlatFileItemWriter。因为我有两个FlatFileItemWriter,所以只有一个项目写入执行上下文。因为一个文件写入的内容比另一个文件多,所以重启时发生了损坏。唯一命名写入器解决了这个问题。如果有更合适的方法来处理这个问题,我将不胜感激。

感谢卢卡·巴索·里奇(LucaBassoRicci)为我指出了这一方向,他对Spring批次没有为这两条河流保存状态发表了评论。

陈晟睿
2023-03-14

如果没有看到您的代码,我猜SB不会为所有两个流保存状态,而是只为一个流保存状态
您必须使用“streams”元素手动注册您正在写入的所有流,如官方文档中所述,这只是一个建议:您编写了针对自定义编写器的扩展的FlatFileItemWriter。对于SB来说,最好的解决方案是使用委派,而不是扩展。如果可以使用ItemStream、ItemWriter或复合超类AbstractItemStreamItemWriter重写代码,请检查代码

 类似资料:
  • 我知道这是一个非常简单的问题,但我似乎找不到一个令人满意的答案。另外,我对Mongo完全是个新手。这显然无济于事。 假设我收藏了...我希望将mongo中的$toupper函数应用于具有_id和的记录的字段,而不是应用于具有的记录。 我一直在玩Mongo的聚合(针对我在google中发现的),但我得到的最多的是一个返回“name”字段的查询,但是: 它返回数据库中的所有记录(不仅是ObjectId

  • 问题内容: 我正在使用logback / slf4j进行日志记录。我想解析我的日志文件以分析一些数据,所以我不想解析一个很大的大文件(主要由调试语句组成),而是要有两个记录器实例,每个实例都记录到一个单独的文件中。一种用于分析,另一种用于通用日志记录。有谁知道使用Logback或其他任何记录器是否可行? 问题答案: 很可能在logback中执行类似的操作。这是一个示例配置: 然后,您将设置两个单独

  • 问题内容: 我正在使用AudioRecord在Android中记录16位PCM数据。记录数据并将其保存到文件后,我将其读回以将其另存为.wav文件。 问题是WAV文件可以被媒体播放器识别,但只能播放纯噪声。目前,我的最佳猜测是我的wav文件头不正确,但我一直无法确定问题出在哪里。(我认为这是因为我可以播放在Audacity中记录的原始PCM数据) 这是我的代码,用于读取原始PCM文件并将其另存为.

  • 问题内容: 好的,这是我设置所有内容的代码: 发生的是 error.log被创建 没有写任何东西 尽管未添加StreamHandler并将debug设置为false,但我仍然将所有内容都添加到STDOUT中(这可能是正确的,但仍然看起来很奇怪) 我是完全离开这里还是发生了什么事? 问题答案: 为什么不这样做呢? 如果现在启动应用程序,你将看到error.log包含: 有关更多信息,请访问http:

  • 我在我的项目中使用log4j。我想有标准输出、调试记录器和最终报告记录器。调试记录器几乎写调试/信息级别的消息。报告将是不同的记录器,只写信息消息。我尝试了不同的方法,阅读了很多示例,我仍然无法解决这个问题。要么我丢失了我的标准输出,要么我将所有调试写入两个记录器。 我的密码在这里 } 任何提示都将不胜感激

  • 问题内容: 好的,这是我设置所有内容的代码: 会发生什么 error.log被创建 没有写任何东西 尽管未添加StreamHandler并将debug设置为false,但我仍然将所有内容都添加到STDOUT中(这可能是正确的,但看起来仍然很奇怪) 我是完全离开这里还是发生什么事? 问题答案: 为什么不这样做呢? 如果现在启动应用程序,则将看到error.log包含: 有关更多信息,请访问http: