我在spring batch
内spring 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?
请建议。感谢。
答案 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;
}