在运行时定义文件名 - Spring 批处理
Defining file name at runtime - Spring Batch
我需要构建一个 spring 批处理应用程序以每天从预定义的文件夹中读取一个文件。文件名有一个前缀模式,但它以当前日期结尾。例如,第一天这个文件将被命名为 foo_20210323,而在第二天另一个文件将被放置在同一个文件夹中,名称为 foo_20210324。我的 Spring-batch 应用程序每天都在考虑编译时创建的文件名。 如何更改应用程序以便在运行时定义文件名?
- 项目全部基于Java配置。
- org.springframework.scheduling.quartz 作为内部调度程序。
- 在特定 class 中定义的文件名。
- 作为参数传递给 reader 的文件名。
有几种方法可以做到这一点,具体取决于您将当前日期传递给作业的方式(作为作业参数,使用系统 属性,等等)。
如果将日期作为作业参数传递,则可以使用步进范围项 reader 并在运行时从作业参数中注入值。这是一个例子:
@Bean
@StepScope
public FlatFileItemReader<String> itemReader(@Value("#{jobParameters['date']}") String date) {
return new FlatFileItemReaderBuilder<>()
.resource(new FileSystemResource("/data/in/foo_" + date))
// set other properties
.build();
}
您可以在参考文档的 Late Binding of Job and Step Attributes 部分找到更多详细信息。
我需要构建一个 spring 批处理应用程序以每天从预定义的文件夹中读取一个文件。文件名有一个前缀模式,但它以当前日期结尾。例如,第一天这个文件将被命名为 foo_20210323,而在第二天另一个文件将被放置在同一个文件夹中,名称为 foo_20210324。我的 Spring-batch 应用程序每天都在考虑编译时创建的文件名。 如何更改应用程序以便在运行时定义文件名?
- 项目全部基于Java配置。
- org.springframework.scheduling.quartz 作为内部调度程序。
- 在特定 class 中定义的文件名。
- 作为参数传递给 reader 的文件名。
有几种方法可以做到这一点,具体取决于您将当前日期传递给作业的方式(作为作业参数,使用系统 属性,等等)。
如果将日期作为作业参数传递,则可以使用步进范围项 reader 并在运行时从作业参数中注入值。这是一个例子:
@Bean
@StepScope
public FlatFileItemReader<String> itemReader(@Value("#{jobParameters['date']}") String date) {
return new FlatFileItemReaderBuilder<>()
.resource(new FileSystemResource("/data/in/foo_" + date))
// set other properties
.build();
}
您可以在参考文档的 Late Binding of Job and Step Attributes 部分找到更多详细信息。