使用name和practicer处理不同的文件-spring批处理

0mkxixxg  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(421)

**我正在处理spring批处理,它将从文件夹中读取所有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,那么创建逻辑(step)和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();

}
vx6bjr1n

vx6bjr1n1#

我不想在工作开始前就费心扩大规模。这里有两个条件流:1)emp或std,2)cre或upt。
对于1),我将创建两个步骤(每种类型一个步骤,遵循unix的理念,让一件事做一件事并做好它),并使用一个decider根据文件名决定要运行哪个步骤。
对于2)我会保持简单,并在writer中使用条件语句来相应地创建或更新项。另一种选择是使用 ClassifierCompositeItemWriter 这是更优雅,但更精心实施。
关于伸缩性,我将为每个文件创建一个作业示例(同样,遵循unix原理),并使用文件名作为作业参数。我不确定分区是否适合您的用例(即使可以为每个文件创建一个分区,最终的解决方案与每个文件的作业示例方法相比也是复杂的)。

相关问题