spring-batch - 在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
.
解决方案
从 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();
}
这在作业和步骤属性的后期绑定部分中进行了解释。
推荐阅读
- sql - 存储过程返回 超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)
- tinymce - 在tinymce中单击菜单项后如何保持菜单保持打开状态
- php - 如何在 php5.6.40 或更高版本中切断字符串,当我可以从 $_GET 控制 var 时?
- database - Counting records with some conditions in a table and displaying with a button on a form
- php - laravel 生成正则表达式来验证输入
- azure - 是否有验证导出的 Azure ARM 模板的好方法?
- apache-camel - cvc-complex-type.3.2.2:属性“exceptionType”不允许出现在元素“throwException”中
- c# - 区分根 CA 和中间 CA 证书
- python - 'NoneType' 对象没有属性 'name' - 当模型之间建立通信时。Flask
- elasticsearch - NLog Elasticsearch 集成 @timestamp 在 ES 中工作错误(提前 2 小时)