Spring 批处理 - 构造 2 reader 和 2 个具有单个写入器的处理器

Spring Batch - construct 2 reader and 2 processor with single writer

我的情况是我有一个批处理作业将从 2 个不同的 table 读取数据并进行不同的处理。

第一个 reader 将执行简单的 SQL 检索和简单的转换,第二个 reader 将执行 SQL 检索并处理后面的更新和插入逻辑。两个 readers 都会 return 一个字符串行并写入一个文件。

在 Spring 批处理中,可能在 1 个步骤中有 2 个 reader 和 2 个处理器,然后传递给 1 个编写器?

  1. 您可以编写自定义代码 reader 并在自定义处理器中编写应用程序级逻辑,以根据输入的内容处理输入。一步中有两个 reader 是没有意义的。 spring 批处理将如何执行它们?完成 reader 1 然后开始 reader 2 是没有意义的。这等同于有两个不同的步骤。

  2. 另一种方法是将 reader 的输出放在一个文件中,然后再执行另一个写入步骤。但我会选择第一种技术。

我会选择 Faiz Pinkman 建议的第二种方法。它更接近 spring-batch 的工作方式。

第一步

  • reader 为您的简单 sql -> 使用标准数据库 reader
  • 处理器 -> 您自己的简单逻辑实现
  • 写入文件 -> 使用标准的 FlatFileItemWriter

第二步

我不明白你说的 "process update and insert logic behind" 到底是什么意思。我假设您从数据库读取数据并基于该数据,您必须在 table.

中执行插入和更新
  • reader 对于更复杂的数据 -> 再次使用标准数据库 reader
  • 处理器 ->
    • 为文本文件准备字符串
    • 准备新的插入和更新
  • writer -> 使用具有以下委托的复合编写器
    • 文本文件的 FlatFileItemWriter
    • DbWriter 取决于您的插入和更新需求

这样,您就有了明确的事务边界,并且可以确定文件的内容以及插入和更新是 "in sync"。

注意:第一步和第二步可以运行并行

第三步 - reader 使用多资源 reader,从两个文件中读取 - 编写器使用 FlatFileItemWriter 将两个内容写入一个文件。

当然,如果你不需要一个文件中的内容,那么你可以跳过第3步。

您也可以依次执行步骤1和步骤2并写入同一个文件。但是根据步骤 1 和 2 的执行时间,性能可能不如并行执行步骤 1 和 2 并使用第三步来合并数据。