在 spring-batch 中动态读取文件
Reading file dynamically in spring-batch
我正在尝试在网络上使用 spring-batch 在不同端点(pc、s3、dropbox、google 驱动器)之间传输任何文件(视频、txt 等)。为此,我得到 json 文件,其中包含要传输的文件位置列表 (url)(假设我可以访问这些位置)。
那么,如何让 reader 在我的控制器被击中(在其中创建作业)而不是在启动 spring-boot 应用程序时读取输入?
我尝试添加“spring.batch.job.enabled=false”,这会停止 spring-batch 自动启动,但我担心的是我应该在哪里设置将提供给 ItemReader 的资源行:
FlatFileItemReader<String> reader = new FlatFileItemReader<String>();
reader.setResource(someResource);
因为在设置资源时我得到 NullPointerException
。
Running Jobs from within a Web Container 用代码示例解释了这一点。这是一个例外:
@Controller
public class JobLauncherController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@RequestMapping("/jobLauncher.html")
public void handle() throws Exception{
jobLauncher.run(job, new JobParameters());
}
}
在您的情况下,您需要从请求中提取文件名并将其作为作业参数传递,例如:
@RequestMapping("/jobLauncher.html")
public void handle() throws Exception{
URL url = // extract url from request
JobParameters parameters = new JobParametersBuilder()
.addString("url", url)
.toJobParameters();
jobLauncher.run(job, parameters);
}
然后使您的 reader step-scoped 并从作业参数中动态提取文件:
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters['url']}") URL url) {
return new FlatFileItemReaderBuilder<String>()
.resource(new UrlResource(url))
// set other properties
.build();
}
Late Binding of Job and Step Attributes 部分对此进行了解释。
我正在尝试在网络上使用 spring-batch 在不同端点(pc、s3、dropbox、google 驱动器)之间传输任何文件(视频、txt 等)。为此,我得到 json 文件,其中包含要传输的文件位置列表 (url)(假设我可以访问这些位置)。
那么,如何让 reader 在我的控制器被击中(在其中创建作业)而不是在启动 spring-boot 应用程序时读取输入?
我尝试添加“spring.batch.job.enabled=false”,这会停止 spring-batch 自动启动,但我担心的是我应该在哪里设置将提供给 ItemReader 的资源行:
FlatFileItemReader<String> reader = new FlatFileItemReader<String>();
reader.setResource(someResource);
因为在设置资源时我得到 NullPointerException
。
Running Jobs from within a Web Container 用代码示例解释了这一点。这是一个例外:
@Controller
public class JobLauncherController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@RequestMapping("/jobLauncher.html")
public void handle() throws Exception{
jobLauncher.run(job, new JobParameters());
}
}
在您的情况下,您需要从请求中提取文件名并将其作为作业参数传递,例如:
@RequestMapping("/jobLauncher.html")
public void handle() throws Exception{
URL url = // extract url from request
JobParameters parameters = new JobParametersBuilder()
.addString("url", url)
.toJobParameters();
jobLauncher.run(job, parameters);
}
然后使您的 reader step-scoped 并从作业参数中动态提取文件:
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters['url']}") URL url) {
return new FlatFileItemReaderBuilder<String>()
.resource(new UrlResource(url))
// set other properties
.build();
}
Late Binding of Job and Step Attributes 部分对此进行了解释。