Spring Batch - 构建2个阅读器和2个带单个写入器的处理器

时间:2015-10-29 05:41:05

标签: spring-batch

我的情况是我有一个批处理作业将从2个不同的表读取数据并以不同的方式处理。

第一个读者将进行简单的SQL检索和简单转换,第二个读者将执行SQL检索和处理更新并插入逻辑。两个读者都将返回一个字符串行并写入文件。

在Spring Batch中,可以在1步中有2个读取器和2个处理器,然后传递给1个写入器?

2 个答案:

答案 0 :(得分:1)

我选择Faiz Pinkman建议的第二种方法。它更接近弹簧批量的工作方式。

第一步

  • 读者简单的sql - >使用标准数据库阅读器
  • 处理器 - >你自己实现的简单逻辑
  • 编写器到文件 - >使用标准的FlatFileItemWriter

第二步

我并没有完全理解你的意思"处理更新并插入"背后的逻辑。我假设您从数据库读取数据并基于该数据,您必须在表中执行插入和更新。

  • 读者可获得更复杂的数据 - >再次使用标准数据库读取器
  • 处理器 - >
    • 准备文本文件的字符串
    • 准备新的插入和更新
  • 作家 - >使用具有以下委托的复合编写器
    • 您的文本文件的FlatFileItemWriter
    • DbWriter取决于您的插入和更新需求

通过这种方式,您可以确定明确的事务边界,并且可以确保文件的内容以及插入和更新是"同步"。

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

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

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

您也可以在彼此之后执行步骤1和2并写入同一文件。但是,根据步骤1和2的执行时间,性能可能不如并行执行步骤1和2,并使用第三步来复制数据。

答案 1 :(得分:0)

  1. 您可以编写自定义阅读器代码并在自定义处理器中编写应用程序级逻辑,以根据内容处理输入。一步完成两个读者是没有意义的。弹簧批次将如何执行它们?完成阅读器1然后启动阅读器2是没有意义的。这与具有两个不同步骤相同。

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