gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:23 26 4
gpt4 key购买 nike

我在 spring boot 项目中有一个 spring batch,它处理输入文件中的记录。

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

我想通过对批处理进行分区来利用多线程,如前所述 here .

但我希望产生的线程数应该根据输入文件中的记录数来决定。

例如,如果记录 <10,000,则只生成 10 个线程。如果它们 >10,000 && <50,000,则生成 20 个线程等。

但如果我没记错的话,在分区批处理时,您必须事先提供gridSize 并在的基础。

这给我带来了一个问题,因为 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呢?

请提出建议。谢谢。

最佳答案

您可以通过 @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;
}

关于java - 在 Spring Batch 中动态设置 gridSize(线程数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48156971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com