首页 > 解决方案 > 使用名称与从业者一起处理不同的文件 - Spring批处理

问题描述

**我正在开发 Spring Batch,它将从文件夹中读取所有 CSV 文件,并且需要根据文件 bame 执行不同的过程。以下代码适用于一种文件(名称)类型。但问题是我需要根据“文件名”决定步骤执行。任何人,请帮助这个逻辑?

我的文件名格式:

EMP.CRE.3434234.3.6.csv
EMP.UPT.3434234.3.7.csv
STD.CRE.3434234.3.8.csv
STD.UPT.3434234.3.9.csv

基于 EMP 或 STD,我需要执行不同的处理逻辑。如果是 CRE,则创建逻辑(步骤),UPT 表示更新数据。

以下是我当前的代码结构:

@Bean
public Job employeeJob() throws Exception{
  return jobs.get("employeeJob")
             .start(masterStep())
              .build();
}

@Bean
public step masterStep() throws Exception{
  return steps.get("masterStep").partitioner(slavestep()
             .partitioner("partition",partitioner())
              .taskExecutor(taskExecutor()).build();
}

@Bean
public step slaveStep() throws Exception{
  return steps.get("slaveStep").<EmployeeData, EmployeeData>chunk(10)
             .reader(reader(null))
             .processor(processor(null,null)
              .writer(writer()).build();
}

@Bean
@JobScope
public Partitioner partitioner() throws Exception{
  MultiResourcePartitioner partitioner = new MultiResourcePartitioner();
  PathMatchingResourcePatternResolver resolver= new PathMatchingResourcePatternResolver();
partitioner.SetResources(resolver.getResources("file:"+Resourcepath+ filetype));
partitioner.partition(20);
return partitioner;
}

@Bean
@StepScope
public FlatFileItemReader<EmployeeData> reader(@value("#stepExecutionContext['fileName] String file){
return new FlatFileItemReaderBuilder<EmployeeData>()
...
...
.build();

}

标签: javaspringspring-bootspring-batchspring-batch-tasklet

解决方案


在工作之前,我不会费心扩展工作。这里有两个条件流程:1) EMP 或 STD 和 2) CRE 或 UPT。

  • 对于 1),我将创建两个步骤(每种类型一个,遵循使一件事做一件事并做好的 unix 哲学)并使用一个决定器来决定根据文件名运行哪个步骤。

  • 对于 2) 我会保持简单,并在编写器中使用条件语句来相应地创建或更新项目。另一种选择是使用ClassifierCompositeItemWriter更优雅但更复杂的实现。

关于缩放,我会为每个文件创建一个作业实例(同样,遵循 unix 理念)并将文件名用作作业参数。我不确定分区是否适合您的用例(即使可以为每个文件创建一个分区,与每个文件的作业实例方法相比,最终解决方案也会令人费解)。


推荐阅读