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