Как добиться параллельной обработки, чтобы улучшить время обработки - PullRequest
0 голосов
/ 29 ноября 2018

В настоящее время я использую Springbatch для обработки файлов CSV и Excel следующим образом.

  1. Reader (будет анализировать файлы CSV / Excel и мужской Pojo)
  2. Процессор (ударит Dbесть ли эта запись в БД или нет)
  3. 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;
    }

}

Заранее спасибо !!!

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете использовать технику разделения для разделения входных файлов и их параллельной обработки.Это подробно объясняется в разделе Partitioning справочной документации.

Также можно посмотреть Пример локального разбиения и Пример удаленного разбиения в модуле spring-batch-samples.

Есть похожие вопросы к этому, я добавляю их здесь для справки:

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...