如何实现并行处理以缩短处理时间

时间:2018-11-29 15:50:27

标签: spring-mvc spring-boot spring-batch

目前,我正在使用springbatch以以下方式处理csv和excel文件。

  1. 阅读器(将解析csv / excel文件和男性pojo)
  2. 处理器(无论该记录是否在数据库中,都将在Db上击中Db)
  3. 作家(将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();

==== 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;
    }

}

提前谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用分区技术对输入文件进行分区并并行处理它们。参考文档的Partitioning部分对此进行了详细说明。

您还可以在spring-batch-samples模块中查看Local partitioning sampleRemote partitioning sample

有与此类似的问题,我在这里添加以供参考:

希望这会有所帮助。