用于并行处理的弹簧批量结构

时间:2016-09-06 11:34:59

标签: java spring-batch

我正在寻求一些指导,请参考如何构建一个Spring批处理应用程序来摄取一堆可能很大的分隔文件,每个文件都有不同的格式。

要求很明确:

  1. 选择要从外部源摄取的文件:每天可能有多个文件的多个版本,因此必须选择最新版本
  2. 通过将分隔的字段与第一行的列名(跳过)相结合,将每个文件的每一行转换为json。
  3. 将每行json发送到RESTFul Api
  4. 我们有一个步骤,它使用MultiResourceItemReader按顺序处理文件。文件是超时的输入流。

    理想情况下,我认为我们想拥有

    1. 标识要摄取的文件的步骤
    2. 并行处理文件的步骤
    3. 提前致谢。

2 个答案:

答案 0 :(得分:0)

这是一个有趣的。我实现了一个扩展DelimitedLineTokenizer并实现LineCallbackHandler的客户行标记器。然后我将FlatFileItemReader配置为跳过第一行(列名列表)并将第一行传递给处理程序/标记生成器以设置所有标记名称。

然后,自定义FieldSetMapper会收到包含您所有姓名/值对的FieldSet,我只会将其传递给ItemProcessor。然后,您的处理器可以构建您的JSON字符串并将它们传递给您的编写者。

答案 1 :(得分:0)

显然,你的工作属于典型的 - 读者 - >处理器 - >编写器类别,编写器在您的情况下是可选的(如果您不希望在发送到RESTFul API之前保留JSON),或者您可以调用步骤将{JSON}发送到REST服务Writer如果{ {1}}在收到服务响应后完成。

无论如何,您不需要单独的步骤来了解文件名。使其成为应用程序初始化代码的一部

here列出了并行化应用程序的策略。

你刚才说了一堆文件。如果这些文件中的行数具有相似的计数,我会采用分区方法(即通过实现Writer接口,我将每个文件移交给一个单独的线程,该线程将执行一步 - 读者 - >处理器 - >编写者)。在这种情况下你不需要Partitioner但是简单的单个文件阅读器,因为每个文件都有自己的阅读器。 Partitioning

如果这些文件中的行数变化很大,即如果一个文件需要花费数小时而另一个文件在几分钟内完成,则可以继续使用MultiResourceItemReader,但使用Multi-threaded Step的方法来实现并行性。这是块级并行,所以你可能必须使读者线程安全。

由于您的步骤不是独立的,因此方法Parallel Steps看起来不适合您的情况。

希望它有所帮助!!