Spring boot 配置读写器时,jobParameters和@JobScope/@StepScope over Environment/@ConfigurationProperties的Spring引导批处理用例?
我正在尝试为SpringBatch引导编写一些一致且风格正确的代码,我正在寻找一些反馈 Spring批处理经典步骤范围示例:Spring boot 配置读写器时,jobParameters和@JobScope/@StepScope over Environment/@ConfigurationProperties的Spring引导批处理用例?,spring-boot,spring-batch,Spring Boot,Spring Batch,我正在尝试为SpringBatch引导编写一些一致且风格正确的代码,我正在寻找一些反馈 Spring批处理经典步骤范围示例: @Bean @StepScope public FlatFileItemReader<Partner> reader( @Value("#{jobParameters[pathToFile]}") String pathToFile){ FlatFileItemReader<Partner> itemReader = new
@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;
}
@Bean
@步进镜
公共FlatFileItemReader(
@值(“#{jobParameters[pathToFile]}”)字符串pathToFile){
FlatFileItemReader itemReader=新FlatFileItemReader();
setLineMapper(lineMapper());
setResource(新类路径资源(pathToFile));
返回项目阅读器;
}
pathToFile作为从命令行传递的作业参数获取。由于后期绑定,需要步骤作用域
在Spring Boot中,所有从命令行传递的参数都会自动添加到环境中,它们也可用于创建为@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;
}
@Bean
@配置属性(prefix=“my.prefix”)
受保护类作业属性{
字符串路径文件;
…能手/二传手
}
@自动连线
私人物业;
@豆子
公共FlatFileItemReader()读取器{
FlatFileItemReader itemReader=新FlatFileItemReader();
setLineMapper(lineMapper());
字符串pathToFile=jobProperties.getPathToFile();
setResource(新类路径资源(pathToFile));
返回项目阅读器;
}
假设不设置SpringApplication.setAddCommandLineProperties(false),是否存在@StepScope优于Environment/@ConfigurationProperties方法的情况?从风格上来说,这是一种更好的Spring Boot方法吗?(通过代码挖掘,自动配置肯定在很大程度上依赖于@ConfigurationProperties)。这两种方法之间存在一些差异 首先,您实际上是通过进入SpringBatch不知道的全局状态来配置作业。这会破坏Spring批处理中与作业参数相关的功能。例如,SpringBatch将拒绝使用相同的参数执行相同的作业两次。重新启动作业也会遇到更多问题,因为您必须确保在Spring批处理之外设置的状态在两次运行之间是相同的 第二,您失去了通过命令行以外的其他方式启动作业的可能性(或者至少需要实现其他方法来提供相同的全局状态)。如果要同时运行多个作业,或者要通过功能测试来测试作业,这将导致问题 第三,
reader
bean的范围在这两种方法上是不同的。在@StepScope
示例中,bean的范围设置为step
,在重构示例中,范围为singleton
。在后一种情况下,bean只有一个对象实例;在前者中,在每个请求bean的步骤中都会有一个新实例(还将有一个单例范围的代理,以便可以将bean注入到不同范围的bean中)
最后,使用@StepScope
,您还可以从步骤ExecutionContext
注入对象,而无需经过ChunkContext
,这简化了代码和可测试性
顺便说一句,在第一个示例中,
reader
只需要是@JobScope
d,您就可以插入作业参数 这些都是好的观点。我的主要用例是命令行,其中Spring boot将使用本地配置文件执行作业,因此全局状态的大部分在那里进行管理。我提供了一个RunIdIncrementer,所以至少有run.id=1,2,3。。。与工作有关。也就是说,我想采用一些约定,将来这些约定可以在容器/管理器中运行,您所说的是有意义的。