【问题标题】:How to process multiple different files in different ways using Spring Batch如何使用 Spring Batch 以不同的方式处理多个不同的文件
【发布时间】:2019-05-01 13:58:52
【问题描述】:

背景/上下文

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

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

问题

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

例子:

  • 文件Data_20190501_ABC_000.txt 包含4 列波浪线分隔的数据,需要映射到表ABC_data 6 列(两列是元数据)
  • 文件Data_20190501_DEF_000.txt 包含12 列波浪号分隔的数据,需要映射到表DEF_data 14 列(两列是元数据)
  • 文件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


    【解决方案1】:

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

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

    希望这会有所帮助。

    【讨论】:

    • 我已经按照您的建议完成了我的想法,一切都编译好了,它似乎认识到有两个步骤,但它只执行了第一步。请在我的问题中查看更新
    • 您的作业定义将按顺序执行步骤。您可以并行运行它们,请参阅本节中的操作方法:docs.spring.io/spring-batch/4.1.x/reference/html/…。关于信息消息Step already complete..,请注意默认情况下,如果在上一次运行中完成了一个步骤,则不会重新执行,您可以通过设置allowStartIfComplete标志覆盖此行为并使其每次运行.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多