首页 > 解决方案 > 在spring-batch中动态读取文件

问题描述

我正在尝试在网络上使用 spring-batch 在不同端点(pc、s3、Dropbox、谷歌驱动器)之间传输任何文件(视频、txt 等)。为此,我正在获取包含要传输的文件位置(url)列表的 json 文件(假设我可以访问这些位置)。

那么,一旦我的控制器被击中(在哪个作业中创建)而不是在启动 spring-boot 应用程序时,我如何告诉读者读取输入?

我尝试添加“spring.batch.job.enabled=false”,它会停止 spring-batch 自动启动,但我担心的是我应该在哪里写设置将提供给 ItemReader 的资源行:

FlatFileItemReader<String> reader = new FlatFileItemReader<String>();
reader.setResource(someResource);

因为在设置资源时我得到了NullPointerException.

标签: spring-batch

解决方案


从 Web 容器中运行作业通过代码示例解释了这一点。这是一个例外:

@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);
}

然后让您的阅读器步进范围并从作业参数中动态提取文件:

@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters['url']}") URL url) {
   return new FlatFileItemReaderBuilder<String>()
        .resource(new UrlResource(url))
        // set other properties
        .build();
}

这在作业和步骤属性的后期绑定部分中进行了解释。


推荐阅读