spring-boot - 多线程步骤中运行的线程过多
问题描述
我有一个使用最大线程限制 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;
}
在处理了 200 万条记录文件后,我可以在日志文件中看到创建了太多线程,即使我将限制设置为 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 INFO [batch-thread35343] com.db.wmdl.pricefile.job.batch.listener.PriceFileWriterListener ([]) - PriceFileWriterListener - afterWrite; 列表大小:50 2019-07-02T17:02:30,219 8130180 INFO [batch-thread35342] com.db.wmdl.pricefile.job.batch.listener.PriceFileWriterListener ([]) - PriceFileWriterListener - afterWrite; 列表大小:50 2019-07-02T17:02:30,340 8130301 INFO [batch-thread35344] com.db.wmdl.pricefile.job.batch.listener。PriceFileWriterListener ([]) - PriceFileWriterListener - afterWrite; 列表大小:50 2019-07-02T17:02:30,504 8130465 INFO [batch-thread35345] com.db.wmdl.pricefile.job.batch.listener.PriceFileWriterListener ([]) - PriceFileWriterListener - afterWrite; 列表大小:50 2019-07-02T17:02:30,513 8130474 INFO [batch-thread35349] com.db.wmdl.pricefile.job.batch.listener.PriceFileReaderListener ([]) - PriceFileReaderListener - beforeRead 2019-07-02T17:02 :30,513 8130474 INFO [batch-thread35350] com.db.wmdl.pricefile.job.batch.listener.PriceFileReaderListener ([]) - PriceFileReaderListener - beforeRead 2019-07-02T17:02:30,513 8130474 INFO [batch-thread35351] com. db.wmdl.pricefile.job.batch.listener.PriceFileReaderListener ([]) - PriceFileReaderListener - beforeRead 2019-07-02T17:02:30,513 8130474 INFO [batch-thread35352] com.db.wmdl.pricefile.job.batch。
解决方案
SimpleAsyncTaskExecutor
不重用线程。以下是其Javadoc的摘录:
注意:此实现不重用线程!考虑一个线程池 TaskExecutor 实现,特别是用于执行大量短期任务。
在您的情况下,您可以使用ThreadPoolTaskExecutor
并将其设置maxPoolSize
为 10。
推荐阅读
- python - 我们如何使用 scikit-learn 绘制 ROC 曲线以进行遗漏 (LOO) 交叉验证?
- ibm-cloud - IBM Watson Assistant - 在自定义实体中存储槽数据?
- sql - 在 Oracle 上合并查询插入但不更新
- python - 从 Powerpoint 中提取表格
- sql - 如何将点移动到3米距离内的道路附近
- python - 在每个子列表的第二个元素中添加一个数字
- javascript - 如何在表格中显示/隐藏模型?
- c# - 为表格的每一行渲染上下文菜单
- php - 在 Codeigniter 的查询构建器中重写数据库查询
- android - 如何使用 android 导航 jetpack 工具更新先前片段的数据?