在Spring Batch中动态设置gridSize(线程数)

时间:2018-01-08 19:34:33

标签: java multithreading spring-boot spring-batch

我在spring batchspring boot项目处理输入文件中的记录。

输入文件中的记录数可能在 1到1百万之间变化。

我想通过分区批处理来利用多线程,如上所述here

但是我想要根据输入文件中的记录数决定产生的线程数。

比如说,如果记录<10,000,那么只产生10个线程。 如果它们> 10,000&amp;&amp; &lt; 50,000然后产生20个线程&amp;等等。

但如果我没有错,那么当分区批处理时,你必须事先提供gridSize&amp;在此基础上实施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 个答案:

答案 0 :(得分:1)

您可以使用@StepScope注释来设置延迟范围来设置Gride尺寸

选项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;
  }