0

背景/上下文

我看到了几乎无数关于如何使用 Spring Batch 处理多个文件的示例,但是它们中的每一个都有一个所有文件都被处理成的对象。因此,许多包含兼容数据的文件都被处理到单个目标目标中,例如数据库表。

我想构建一个导入过程,它将接收十个不同的文件并将它们映射到同一个数据库/模式中的十个不同的目标表。文件名每天也会以可预测/可编码的方式略有变化,但我想我能处理好。我认为 Spring 可以做到这一点(多对多数据映射),但这是我不知道如何做的最后一件事。Spring 的声明式结构在某些方面非常有用,但老实说,我不确定如何设置多个映射,而且由于应用程序确实没有程序部分可言,所以我不能真正使用任何形式的迭代. 我可以简单地为每个文件制作单独的 jar,并在控制台上编写迭代脚本,但这也会使日志记录和报告变得复杂......坦率地说,这听起来很老套

问题

我如何告诉 Spring Batch 以十种不同的方式处理十个不同文件中的每一个,并将它们的数据映射到同一个数据库中的十个不同表中?

例子:

  • 文件Data_20190501_ABC_000.txt包含 4 列波浪号分隔的数据,需要映射到ABC_data6 列的表(两列是元数据)
  • 文件Data_20190501_DEF_000.txt包含 12 列波浪号分隔的数据,需要映射到DEF_data14 列的表(两列是元数据)
  • 文件Data_20190501_GHI_000.txt包含 10 列波浪号分隔的数据,需要映射到GHI_data12 列的表(两列是元数据)
  • 等等...十个不同的文件和表格

我可以处理波浪号分隔,我认为我可以以编程方式处理文件名中的日期,并且可以在 db 触发器中处理其中一个字段。另一个元数据字段应该是文件名,但这肯定是一个不同的问题。

更新

根据我认为 Mahmoud Ben Hassine 的建议,我为每个文件/表对创建了一个单独的读取器、映射器和写入器,并尝试使用 start(step1)、next(step2)、build() 范式以格式添加它们下面基于Spring 文档中的配置和运行作业中的示例:

@Autowired
private JobBuilderFactory jobs;

@Bean
public Job job(@Qualifier("step1") Step step1, @Qualifier("step2") Step step2) {
    return jobs.get("myJob").start(step1).next(step2).build();
}

任何一个步骤都独立运行,但是一旦我将一个步骤添加为“下一步”,它只会执行第一个步骤,并在日志输出中生成“步骤已经完成或不可重新启动,因此无需执行任何操作”信息消息 - 其中我要离开这里吗?

4

1 回答 1

1

Spring Batch 中面向块的步骤一次只能处理一种类型的项目。我会使用其中包含不同面向块的步骤的作业。这些步骤可以并行运行,因为输入文件之间没有关系/顺序。

大多数配置在您的情况下都是常见的,因此您可以创建一个具有通用配置属性的抽象步骤定义,并为每个步骤创建具有特定属性的多个步骤(在您的情况下,我认为它应该是文件名、字段设置映射器和目标表)。

希望这可以帮助。

于 2019-05-01T14:48:57.217 回答