在 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 作业设置调度程序?

带有 JobParameters 的 Spring Batch SQL 命令

动态设置 dojox.grid.datagrid 标题列宽

Spring Batch - Spring 集成

如何在 CSS Grid 设置中考虑动态行?

EXT grid 怎样在JS里面动态设置为只读.不可编辑?