我试图为Spring Batch Boot编写一些一致且风格正确的代码,并且我正在寻找一些反馈。
Spring批处理经典步骤范围示例:
@Bean
@StepScope
public FlatFileItemReader<Partner> reader(
@Value("#{jobParameters[pathToFile]}") String pathToFile){
FlatFileItemReader<Partner> itemReader = new FlatFileItemReader<Partner>();
itemReader.setLineMapper(lineMapper());
itemReader.setResource(new ClassPathResource(pathToFile));
return itemReader;
}
获取pathToFile 作为从命令行传递的作业参数。由于后期绑定,需要步长范围。
在Spring Boot中,从命令行传递的所有参数都会自动添加到Environment中,并且对于作为@ConfigurationProperties创建的bean也可以使用它们。
重构的步骤范围示例:
@Bean
@ConfigurationProperties(prefix = "my.prefix")
protected class JobProperties {
String pathToFile;
...getters/setters
}
@Autowired
private JobProperties jobProperties;
@Bean
public FlatFileItemReader<Partner> reader() {
FlatFileItemReader<Partner> itemReader = new FlatFileItemReader<Partner>();
itemReader.setLineMapper(lineMapper());
String pathToFile = jobProperties.getPathToFile();
itemReader.setResource(new ClassPathResource(pathToFile));
return itemReader;
}
假设 SpringApplication.setAddCommandLineProperties(false)未设置,是否存在@StepScope优于Environment / @ ConfigurationProperties方法的情况?在风格上,一种更好的Spring Boot方法吗? (通过代码挖掘自动配置肯定非常依赖于@ConfigurationProperties)。
答案 0 :(得分:1)
这两种方法之间存在一些差异。
其一,您通过进入Spring Batch不了解的全球状态来实际配置作业。这会破坏Spring Batch中与作业参数相关的功能。例如,Spring Batch将拒绝使用相同的参数执行相同的作业两次。重新启动作业时也会遇到更多麻烦,因为您必须确保在Spring Batch之外设置的状态在两次运行之间是相同的。
二,您失去了通过命令行以外的其他方式启动作业的可能性(或者至少您需要实现其他方法来提供相同的全局状态)。如果您想同时运行多个作业,或者想要通过功能测试来测试作业,这将导致问题。
第三,reader
bean的范围在两种方法上是不同的。在您的@StepScope
示例中,bean的范围设置为step
,在您的重构示例中,范围为singleton
。在后一种情况下,bean只有一个对象实例;在前者中,在请求bean的每个步骤中都会有一个新实例(也会有一个单例范围的代理,以便可以将bean注入到作用域不同的bean中)。
最后,使用@StepScope
,您还可以从步骤ExecutionContext
中注入对象,而无需通过例如ChunkContext
reader
,简化了代码和可测试性。
顺便说一句,在您的第一个示例中,@JobScope
只需要Asset_ID MAterial Swap_Location
MFG111 Brick Top left
MFG111 Plastic Top right
MFG113 Wood Center
d,您就可以注入作业参数。