在Configuring Spring Batch Steps in Parallel (Split) using Annotations的答案中 给出了一个例子(FlowJobBuilderTests.java)。
问题:这个答案真的适合性能优化吗? (我有一些长时间运行的CPU消耗任务要执行,需要以优化的方式使用可用的CPU)
答案 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;
}
}
在此示例中,addTeaStep
和addSugarStep
将在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/。