目前,我正在使用springbatch以以下方式处理csv和excel文件。
实时我有50k条记录要处理,而我的代码几乎要花25分钟。我想通过实现并行处理来缩短处理时间(以便并行处理,从而可以在更短的时间内处理相同的内容)。
但是我不知道如何使用Spring Batch实现并行处理。有人可以指导我如何做吗,或者可以提出任何建议来缩短处理时间。
@Bean
public TaskExecutor taskExecutor(){
return new SimpleAsyncTaskExecutor("CSV-Async-batch");
}
@Bean(name="csvjob")
public Job job(JobBuilderFactory jobBuilderFactory,StepBuilderFactory stepBuilderFactory,ItemReader<List<CSVPojo>> itemReader,ItemProcessor<List<CSVPojo>,CsvWrapperPojo> itemProcessor,AmqpItemWriter<CsvWrapperPojo> itemWriter){
Step step=stepBuilderFactory.get("ETL-CSV").<List<CSVPojo>,CsvWrapperPojo>chunk(100)
.reader(itemReader)
.processor(itemProcessor)
.writer(itemWriter)
.taskExecutor(taskExecutor())
.throttleLimit(40)
.build();
Job csvJob= jobBuilderFactory.get("ETL").incrementer(new RunIdIncrementer())
.start(step).build();
==== SynchronizedItemStreamReader的读取器=================
@Component
public class Reader extends SynchronizedItemStreamReader<List<CSVPojo>> {
public static MultipartFile reqFile=null;
List<CSVPojo> result = new ArrayList<CSVPojo>();
@Autowired
private CSVProcessService csvProcessService;
public static boolean batchJobState ;
/*public Reader(MultipartFile file){
this.reqFile=file;
}*/
public void setDelegate(ItemStreamReader<List<CSVPojo>> delegate){
/*try {
this.read();
} catch (UnexpectedInputException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NonTransientResourceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
@Override
public List<CSVPojo> read() throws Exception, UnexpectedInputException,
ParseException, NonTransientResourceException {
// TODO Auto-generated method stub
if(!batchJobState){
result=csvProcessService.processCSVFile(reqFile);
System.out.println("in batch job reader");
batchJobState=true;
return result;
}
return null;
}
}
提前谢谢!
答案 0 :(得分:0)
您可以使用分区技术对输入文件进行分区并并行处理它们。参考文档的Partitioning部分对此进行了详细说明。
您还可以在spring-batch-samples
模块中查看Local partitioning sample和Remote partitioning sample。
有与此类似的问题,我在这里添加以供参考:
希望这会有所帮助。