Spring 批处理:在作业运行时创建新步骤

Spring Batch: Create new steps at job runtime

Context:我正在研究 Spring 将数据上传到数据库的批处理管道。我已经弄清楚如何读取平面 .csv 文件并使用 JdbcBatchItemWriter 从中写入项目。我正在处理的管道必须从包含多个 .csv 不同类型文件的 Zip 存档中读取数据。我希望将存档下载和 检查 作为工作的两个第一步。我没有足够的磁盘 space 来解压整个加载的存档。我没有解压缩,而是 检查 zip 文件内容以定义 Zip 文件系统中的 .csv 文件路径及其类型。 Zip 文件检查允许轻松获得相应 csv 文件的 InputStream。之后,读取和上传(直接从 zip)所有发现的 .csv 文件将在作业的单独步骤中执行。

问题:有什么方法可以为 job 中发现的每个 csv zip 条目动态填充新的 Steps运行时 作为 inspect 步骤的结果?

Tried:我知道 Spring Batch 有 conditional flow 但似乎这种技术只允许配置之前明确定义的静态步骤数作业执行。在我的例子中,步骤数(csv 个文件)和 reader 类型是在作业的第二步发现的。

此外,还有一个 MultiResourceItemReader 允许顺序读取多个资源。但我将使用适当的 reader 读取不同类型的 csv 文件。此外,我希望有“filewise”步骤封装,这样如果一个文件加载步骤失败,其他的仍然会被执行。

类似的问题 does not have suitable solution for me as 假设在作业运行之前创建步骤,而我需要添加步骤作为作业的第二步结果。

您可以使用 partitioned steps

  1. 将包含 csv 列表的变量作为资源传递给 检查步骤中的 JobExecutionContext
  2. 在分区方法中检索 csv 列表并为每个创建一个分区。
  3. 将为每个创建的分区执行该步骤