Spring Boot Batch:CPU性能优化示例

时间:2016-12-27 04:36:22

标签: java spring spring-boot spring-batch

Configuring Spring Batch Steps in Parallel (Split) using Annotations的答案中 给出了一个例子(FlowJobBuilderTests.java)。

问题:这个答案真的适合性能优化吗? (我有一些长时间运行的CPU消耗任务要执行,需要以优化的方式使用可用的CPU)

2 个答案:

答案 0 :(得分:0)

您指向使用SimpleAsyncTaskExecutor的示例。

的Javadoc:

  

注意:此实现不会重用线程!请考虑使用线程池TaskExecutor实现,尤其是执行大量短期任务。

因此,为了提高CPU利用率,我宁愿使用ThreadPoolTaskExecutor or ConcurrentTaskExecutor

由于您的任务受CPU限制,我会将线程池大小配置为将运行的计算机上的CPU核心数量。这样你的CPU周期就不会浪费在切换线程上。

(具有更大的线程池大小将适合IO边界任务,因此CPU不会等待IO操作)

评论反应:

现在我更了解你的担忧。是的,您可以并行执行步骤。这是example from my book about enterprise Spring

  @Bean
  public Job prepareTeaJob(JobBuilderFactory jobBuilderFactory,
      @Qualifier("boilWaterStep") Step boilWaterStep,
      @Qualifier("addTeaStep") Step addTeaStep,
      @Qualifier("addSugarStep") Step addSugarStep,
      @Qualifier("addWaterStep") Step addWaterStep,
      TaskExecutor customTaskExecutor) {
    Job job = jobBuilderFactory.get("prepareTeaJob")
        .start(boilWaterStep)
        .split(customTaskExecutor)
        .add(new FlowBuilder<Flow>("addIngredientsSplit")
            .from(boilWaterStep).next(addTeaStep)
            .from(boilWaterStep).next(addSugarStep)
            .end())
        .next(addWaterStep)
        .end()
        .build();
    return job;
  }
}

在此示例中,addTeaStepaddSugarStep将在boilWaterStep之后并行执行。

答案 1 :(得分:0)

使用

        Thread thread = Thread.currentThread();
        System.out.println(thread);
步骤中的

表明该示例确实使用了线程。因此这个例子是合适的。

使用各种线程的另一个好例子是:

Ashraf Sarhan的

https://examples.javacodegeeks.com/enterprise-java/spring/batch/spring-batch-multithreading-example/