在 Spring Batch 中动态设置 gridSize(线程数)
Posted
技术标签:
【中文标题】在 Spring Batch 中动态设置 gridSize(线程数)【英文标题】:Set gridSize (number of threads) dynamically in Spring Batch 【发布时间】:2018-06-17 19:49:20 【问题描述】:我在spring boot
项目中有一个spring batch
,用于处理输入文件中存在的记录。
输入文件中的记录数可以在1 到 100 万之间变化。
我想通过对批处理进行分区来利用多线程,如 here 所述。
但我希望产生的线程数应该根据输入文件中的记录数来决定。
比如说,如果记录少于 10,000 条,那么只产生 10 个线程。 如果它们 >10,000 &&
但如果我没记错的话,在分区批次时,您必须事先提供gridSize
并在此基础上实施Partitioner.class
。
这给我带来了一个问题,因为 gridSize 的值应该存在于PartitionHandler bean
中,例如:
@Bean
public PartitionHandler masterSlaveHandler()
TaskExecutorPartitionHandler handler = new TaskExecutorPartitionHandler();
handler.setGridSize(****some dynamic value****);
handler.setTaskExecutor(taskExecutor());
handler.setStep(slave());
try
handler.afterPropertiesSet();
catch (Exception e)
e.printStackTrace();
return handler;
由于我事先不知道值,我的 @Configuration
类将不会被构建并会抛出错误。
那么如何动态设置gridSize呢?
请提出建议。谢谢。
【问题讨论】:
【参考方案1】:您可以通过 @StepScope
注释使用惰性作用域来设置网格大小
选项 1:如果您想从 stepExecutionContext 设置网格大小
@Bean
@StepScope
public PartitionHandler masterSlaveHandler(@Value("#stepExecutionContext[gridSize]") int gridSize)
TaskExecutorPartitionHandler handler = new TaskExecutorPartitionHandler();
handler.setGridSize(gridSize);
handler.setTaskExecutor(taskExecutor());
handler.setStep(slave());
try
handler.afterPropertiesSet();
catch (Exception e)
e.printStackTrace();
return handler;
选项 1:如果您想通过作业参数设置网格大小
@Bean
@StepScope
public PartitionHandler masterSlaveHandler(@Value("#jobParameters[gridSize]") int gridSize)
TaskExecutorPartitionHandler handler = new TaskExecutorPartitionHandler();
handler.setGridSize(gridSize);
handler.setTaskExecutor(taskExecutor());
handler.setStep(slave());
try
handler.afterPropertiesSet();
catch (Exception e)
e.printStackTrace();
return handler;
【讨论】:
以上是关于在 Spring Batch 中动态设置 gridSize(线程数)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Cloud Data Flow 中为 Spring Batch 作业设置调度程序?