Слишком много потоков выполняется в многопоточном шаге - PullRequest
0 голосов
/ 02 июля 2019

У меня есть многопоточный шаг, созданный с максимальным пределом потока 10;

private static final int THREAD_NUMBER = 10;

@Bean
public TaskExecutor taskExecutor(){
    SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor("batch-thread");
    simpleAsyncTaskExecutor.setConcurrencyLimit(THREAD_NUMBER);
    return simpleAsyncTaskExecutor;
}


@Bean
protected Tasklet readHeader() {
    EkuampVorsatzReader ekuampVorsatzReader = new EkuampVorsatzReader();
    return ekuampVorsatzReader;
}

@Bean
public Step stepGetPriceFileHeader(){
    return stepBuilderFactory.get("batch-job_price_file-step-get-pricefile-header").tasklet(readHeader()).build();
}

@Bean
public Step stepGetPriceFileData() {
    return stepBuilderFactory.get("batch-job_price_file-step-get-pricefile-data")
            .<ImportLogEntity, ImportLogEntity>chunk(50)
            .reader(priceFileReader).listener(priceFileReaderListener)
            .writer(priceFileWriter)
            .listener(priceFileStepListener)
            .taskExecutor(taskExecutor())
            .throttleLimit(THREAD_NUMBER)
            .build();
}

@Bean
public Job batchJobPriceFile() {
    Job job = jobBuilderFactory.get("batch-job_price_file")
            .start(stepGetPriceFileHeader())
            .next(stepGetPriceFileData())
            .listener(jobExecutionListener)
            .build();
    return job;
}

После обработки файла с 2 миллионами записей я вижу в файле журнала, что создано слишком много потоков, даже если я установил ограничениедо 10 потоков.Пример: INFO [batch-thread35348] Подскажите, пожалуйста, почему?Спасибо.

2019-07-02T17: 02: 29,896 8129857 ИНФОРМАЦИЯ [batch-thread35348] com.db.wmdl.pricefile.job.batch.listener.PriceFileReaderListener ([]) - PriceFileReaderListener -beforeRead 2019-07-02T17: 02: 30,147 8130108 ИНФОРМАЦИЯ [batch-thread35341] com.db.wmdl.pricefile.job.batch.listener.PriceFileWriterListener ([]) - PriceFileWriterListener - afterWrite;Размер списка: 50 2019-07-02T17: 02: 30,191 8130152 ИНФОРМАЦИЯ [batch-thread35343] com.db.wmdl.pricefile.job.batch.listener.PriceFileWriterListener ([]) - PriceFileWriterListener - afterWrite;Размер списка: 50 2019-07-02T17: 02: 30,219 8130180 ИНФОРМАЦИЯ [batch-thread35342] com.db.wmdl.pricefile.job.batch.listener.PriceFileWriterListener ([]) - PriceFileWriterListener - afterWrite;Размер списка: 50 2019-07-02T17: 02: 30,340 8130301 ИНФОРМАЦИЯ [batch-thread35344] com.db.wmdl.pricefile.job.batch.listener.PriceFileWriterListener ([]) - PriceFileWriterListener - afterWrite;Размер списка: 50 2019-07-02T17: 02: 30,504 8130465 ИНФОРМАЦИЯ [batch-thread35345] com.db.wmdl.pricefile.job.batch.listener.PriceFileWriterListener ([]) - PriceFileWriterListener - afterWrite;Размер списка: 50 2019-07-02T17: 02: 30,513 8130474 ИНФОРМАЦИЯ [batch-thread35349] com.db.wmdl.pricefile.job.batch.listener.PriceFileReaderListener ([]) - PriceFileReaderListener - перед прочтением 2019-07-02T17: 02: 30,513 8130474 ИНФОРМАЦИЯ [batch-thread35350] com.db.wmdl.pricefile.job.batch.listener.PriceFileReaderListener ([]) - PriceFileReaderListener - beforeRead 2019-07-02T17: 02: 30,513 8130474 ИНФОРМАЦИЯ [пакетная нить3535]db.wmdl.pricefile.job.batch.listener.PriceFileReaderListener ([]) - PriceFileReaderListener - beforeRead 2019-07-02T17: 02: 30,513 8130474 ИНФОРМАЦИЯ [batch-thread35352] com.db.wmdl.pricefile.jer.batch.l.PriceFileReaderListener ([]) - PriceFileReaderListener - beforeRead 2019-07-02T17: 02: 30,513 8130474 ИНФОРМАЦИЯ [batch-thread35354] com.db.wmdl.pricefile.job.batch.listener.PriceFileReaderListener (до [201] - цена 201FF)-07-02T17: 02: 30,513 8130474 ИНФОРМАЦИЯ [batch-thread35353] com.db.wmdl.pricefile.job.batch.listener.PriceFileReaderListener ([]) - PriceFileReaderListener - beforeRead 2019-07-02T17: 02: 30,513 8130474 ИНФОРМАЦИЯ [batch-thread35355] com.db.wmdl.pricefile.job.batch.listener.PriceFileReaderListener ([]) - PriceFileReaderListener - beforeRead 2019-07-02T17: 02: 30,586 81547ИНФОРМАЦИЯ [QuartzScheduler_Worker-1] com.db.wmdl.pricefile.job.batch.listener.PriceFileJobListener ([]) - SpringBatchJob [входящий-id: 56435] [spring-batch-job-execute-id: 21] импорт выполнен

1 Ответ

0 голосов
/ 02 июля 2019

SimpleAsyncTaskExecutor не использует потоки повторно. Вот выдержка из его Javadoc :

ПРИМЕЧАНИЕ: эта реализация не использует потоки повторно! Вместо этого рассмотрим реализацию TaskExecutor с пулом потоков, в частности для выполнения большого количества краткосрочных задач.

В вашем случае вы можете использовать ThreadPoolTaskExecutor и установить его maxPoolSize в 10.

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