在 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 部分对此进行了解释。