如何使用Spring Batch以不同的方式处理多个不同的文件

时间:2019-05-01 13:58:53

标签: java spring-batch multiple-files data-ingestion

背景/上下文

我看到了无数关于如何使用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();
}

这两个步骤中的任何一个都独立运行,但是一旦我将其添加为“下一个”步骤,它只会执行第一个步骤,并生成“步骤已完成或无法重新启动,因此没有要执行的操作” INFO消息输出-我从这里去哪里?

1 个答案:

答案 0 :(得分:1)

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

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

希望这会有所帮助。