В настоящее время я использую Springbatch для обработки файлов CSV и Excel следующим образом.
- Reader (будет анализировать файлы CSV / Excel и мужской Pojo)
- Процессор (ударит Dbесть ли эта запись в БД или нет)
- Writer (переведет pojo в очередь сообщений)
В реальном времени у меня есть 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();
==== Reader для 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;
}
}
Заранее спасибо !!!