java - 使用名称与从业者一起处理不同的文件 - 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();
}
解决方案
在工作之前,我不会费心扩展工作。这里有两个条件流程:1) EMP 或 STD 和 2) CRE 或 UPT。
对于 1),我将创建两个步骤(每种类型一个,遵循使一件事做一件事并做好的 unix 哲学)并使用一个决定器来决定根据文件名运行哪个步骤。
对于 2) 我会保持简单,并在编写器中使用条件语句来相应地创建或更新项目。另一种选择是使用
ClassifierCompositeItemWriter
更优雅但更复杂的实现。
关于缩放,我会为每个文件创建一个作业实例(同样,遵循 unix 理念)并将文件名用作作业参数。我不确定分区是否适合您的用例(即使可以为每个文件创建一个分区,与每个文件的作业实例方法相比,最终解决方案也会令人费解)。
推荐阅读
- javascript - 用 moment.js 求和时间
- r - 从 GEOquery 加载微阵列数据时,现在获取样本名称时出错
- macos - NSFont 字体大小与字体度量有何关系
- apache-spark - 当对基础表进行分桶时,Spark 如何在联接表时减少 shuffle
- excel - 使用 Excel VBA 从 Excel 中的查询下载的数据中删除重复项
- ruby-on-rails - 规范患者/医师/预约模式中“可用性”的模型关联?
- r - 在 R 代码中使用 Shiny 中用户修改的矩阵
- javascript - 通过使用jquery将php字符串传递给onclick函数来获取[object Object]
- python - 通过重复减去某些数字来最小化整数
- javascript - 在 Leaflet 地图中计算 Lat-Long 给定的瓦片坐标