Spring boot 配置读写器时,jobParameters和@JobScope/@StepScope over Environment/@ConfigurationProperties的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

我正在尝试为SpringBatch引导编写一些一致且风格正确的代码,我正在寻找一些反馈

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;
}
@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。。。与工作有关。也就是说,我想采用一些约定,将来这些约定可以在容器/管理器中运行,您所说的是有意义的。