【问题标题】:Spring Batch Two Files With Different StructureSpring Batch 两个不同结构的文件
【发布时间】:2020-01-07 15:15:43
【问题描述】:

我有一个春季批处理项目,我必须从两个 .txt 文件中读取,一个有很多行,另一个是一个控制文件,其中包含应该从第一个文件中读取的行数。我知道我必须使用分区来处理这些文件,因为第一个非常大,我需要将它分割并能够在它失败时重新启动它,但我不知道读者应该如何处理这些文件,因为这两个文件他们的线条没有相同的宽度。 所有文件的行中都没有标题或分隔符,因此我必须根据主要在第一个中的范围获取字段。

我的一个疑问是我是否应该在同一个阅读器中阅读两者?以及在使用同一个阅读器的情况下,我应该如何设置阅读器FixedLengthTokenizer和DefaultLineMapper来处理这两个文件??

这些是输入文件和控制文件的示例

- 输入文件

09459915032508501149343120020562580292792085100204001530012282921883101

txt 文件最多可以包含 50000 行

- 控制文件

00128*

它只有一行

谢谢!

【问题讨论】:

  • 你能为每个文件提供一个例子吗? “控制文件”和输入文件的大小是多少?我在问一个常见的技术是缓存参考数据(参见stackoverflow.com/a/52644962/5019386)并在常规的面向块的步骤中使用它(以避免重新读取每个项目的控制文件或参考表)。除此之外,你的输出是什么?你真的需要分区吗?
  • @ Mahmoud Ben Hassine - 输出是几个 txt 文件,其中输入文件的行根据过滤器分布在其中。至于隔断的使用,一个项目开始由另一个人做,离开了公司,然后把这个项目分配给我,最初做的人比我最近对spring batch的了解要多得多开始使用它,并为项目建立了patition的使用,因为需要能够在失败的情况下重新启动它我也认为它是正确的选择。

标签: spring spring-batch


【解决方案1】:

我必须从两个 .txt 文件中读取,一个有很多行,另一个是一个控制文件,其中包含应该从第一个文件中读取的行数

这是处理您的用例的一种可能方法:

  • 创建一个读取控制文件的第一步(tasklet),并将要读取的行数放入作业执行上下文中(与下一步共享)
  • 使用步骤范围读取器创建第二个步骤(面向块),该读取器配置为仅读取由第一步计算的行数(从作业执行上下文中获取值)

您可以在此处阅读有关在步骤之间共享数据的更多信息:https://docs.spring.io/spring-batch/docs/4.2.x/reference/html/common-patterns.html#passingDataToFutureSteps

【讨论】:

  • @ Mahmoud Ben Hassine 非常感谢您的回答。我会尝试这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
相关资源
最近更新 更多