【发布时间】:2019-05-01 13:58:52
【问题描述】:
背景/上下文
我看到了几乎无数关于如何使用 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_data的12列(两列是元数据) - 等...用于十个不同的文件和表
我可以处理波浪号分隔,我认为我可以以编程方式处理文件名中的日期,并且可以在 db 触发器中处理其中一个字段。另一个元数据字段应该是文件名,但这当然可以是一个不同的问题。
更新
根据我认为 Mahmoud Ben Hassine 的建议,我为每个文件/表对创建了单独的读取器、映射器和写入器,并尝试使用 start(step1)、next(step2)、build() 范例添加它们根据 Spring 文档中 Configuring and Running a Job 的示例,采用以下格式:
@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();
}
任何一个步骤都是独立运行的,但是一旦我添加一个作为“下一步”步骤,它只会执行第一个步骤,并在日志中生成“步骤已经完成或不可重新启动,因此没有执行任何操作”信息消息输出 - 我从这里去哪里?
【问题讨论】:
标签: java spring-batch data-ingestion