Java Spring批处理-如何使用从rest API请求收到的文件名启动作业

Java Spring批处理-如何使用从rest API请求收到的文件名启动作业,java,excel,spring,rest,spring-batch,Java,Excel,Spring,Rest,Spring Batch,我试图公开一个RESTAPI,并使用它来接收一个文件名参数,然后用它启动一个Spring批处理作业 我希望每个请求启动作业,并希望我的ItemReader查找该文件名 我已经阅读了一些关于如何通过RESTAPI启动作业的其他问题,以及ItemReader如何访问jobParameters,但找不到从API请求接收参数的方法。 下面是我的代码: @配置 公共类BatchConfig{ @自动连线 公共建筑商建筑商工厂; @自动连线 公共StepBuilderFactory StepBuilderF

我试图公开一个RESTAPI,并使用它来接收一个文件名参数,然后用它启动一个Spring批处理作业

我希望每个请求启动作业,并希望我的ItemReader查找该文件名

我已经阅读了一些关于如何通过RESTAPI启动作业的其他问题,以及ItemReader如何访问jobParameters,但找不到从API请求接收参数的方法。 下面是我的代码:

@配置
公共类BatchConfig{
@自动连线
公共建筑商建筑商工厂;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
私有静态最终字符串将被注入=null;
@豆子
公共作业processJob(){
返回jobBuilderFactory.get(“myJobName”)
.incrementer(新的RunIdIncrementer())
.flow(步骤1())
(完)
.build();
}
@豆子
公共步骤第1步(){
返回stepBuilderFactory.get(“step1”)
.chunk(1)
.reader(excelReader(将被注入))
.processor(新处理器()).faultTolerant().skipPolicy(skip())
.writer(新writer())
.build();
}
@豆子
@步进镜
ItemReader excelReader(@Value(“#{jobParameters['fileName']}”)字符串文件名){
POITEMReader=新POITEMReader();
reader.setLinesToSkip(3);
setResource(新类路径资源(“数据/”+文件名));
setRowMapper(excelRowMapper());
返回读取器;
}
专用行映射器excelRowMapper(){
返回新的FooExcelRowMapper();
}
@豆子
公共政策{
返回新的SkipPolicies();
}
}
和我的控制器:

@RestController
公共类批处理资源{
专用最终JobLauncher JobLauncher;
私人最终工作;
公共批处理资源(JobLauncher JobLauncher,Job Job){
this.jobLauncher=jobLauncher;
这个工作=工作;
}
@邮戳
public void launchJob(@RequestParam(value=“file\u name”,required=true)最终字符串文件名)引发异常{
最终作业参数builder作业参数builder=新作业参数builder();
jobParametersBuilder.addString(“文件名”,文件名);
final JobParameters JobParameters=jobParametersBuilder.toJobParameters();
jobLauncher.run(作业、作业参数);
}
}
不幸的是,ItemReader似乎不理解要读取的文件名。作业“成功”运行,但实际上没有读取我的输入文件


编辑:我以同样的意图启动了一个新项目,并注意到,只要我使用
@StepScope
注释,它就会停止工作,不再工作,即使我删除
@StepScope
注释。现在,我正试图找出如何克服这个问题,实际上,我有完全相同的方法动态地将路径而不是文件名传递给作业:

reader.setResource(new PathResource(path));
这样一切都很顺利。也许试试这个


+请记住,类路径资源必须驻留在jar中。你的档案在哪里

经过一些调试后,我注意到我用来读取excel文件的ItemReader实现()在我开始使用
@StepScope
注释时无法读取excel文件

所以我发现这个问题的答案是尼拉吉·索纳万

基本上,我必须将返回类型从
ItemReader
更改为
poitemreader
,如下所示:

@Bean
@StepScope
PoiItemReader<Foo> excelReader(@Value("#{jobParameters['fileName']}") String fileName) {
    PoiItemReader<Foo> reader = new PoiItemReader<>();
    reader.setLinesToSkip(3);
    reader.setResource(new ClassPathResource("data/" + fileName));
    reader.setRowMapper(excelRowMapper());
    return reader;
}
@Bean
@步进镜
PoiItemReader excelReader(@Value(“#{jobParameters['fileName']}”)字符串文件名){
POITEMReader=新POITEMReader();
reader.setLinesToSkip(3);
setResource(新类路径资源(“数据/”+文件名));
setRowMapper(excelRowMapper());
返回读取器;
}

相同的行为。在BATCH_JOB_EXECUTION表中,EXIT_消息显示:已完成所有步骤或未为此作业配置任何步骤。我的文件位于src/main/resources/data中。当我删除jobParameters并使用硬编码文件名时,它会工作。您注入到BatchResource中的作业是否确实是您在BatchConfig中配置的作业?查看我的代码,我的作业@Bean和injection有@Qualifier(#jobName)。/+jobParametersBuilder.addString(“runId”),请确保运行作业时runId不同。是的,我确保运行的作业与BatchConfig类Your config LGTM中声明的作业相同。您只需要确保从API获得的文件名的值相对于类路径或绝对路径,并相应地使用正确的
Resource
实现(
ClassPathResource
FileSystemResource
),如果使用硬编码的文件名,它就会工作。因此,我相信这不是使用正确的资源实现的问题。在这种情况下,请确保来自rest调用的解析值与您硬编码的值具有相同的基本路径。我以相同的意图启动了一个新项目,并注意到,只要我使用
@StepScope
注释,即使我删除了
@StepScope
注释,它也会停止工作,不再工作。现在我想知道如何克服这个问题。