繁体   English   中英

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

[英]Spring Batch - how to launch job with file name received from rest API request

我正在尝试公开 Rest API 并使用它来接收文件名参数并使用它启动 Spring Batch 作业。

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

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

@Configuration
public class BatchConfig {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    private static final String WILL_BE_INJECTED = null;

    @Bean
    public Job processJob() {
        return jobBuilderFactory.get("myJobName")
                .incrementer(new RunIdIncrementer())
                .flow(step1())
                .end()
                .build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .<Foo, Foo> chunk(1)
                .reader(excelReader(WILL_BE_INJECTED))
                .processor(new Processor()).faultTolerant().skipPolicy(skip())
                .writer(new Writer())
                .build();
    }

    @Bean
    @StepScope
    ItemReader<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;
    }

    private RowMapper<Foo> excelRowMapper() {
        return new FooExcelRowMapper();
    }

    @Bean
    public SkipPolicy skip() {
        return new SkipPolicies();
    }

}

还有我的控制器:

@RestController
public class BatchResource {

    private final JobLauncher jobLauncher;

    private final Job job;

    public BatchResource(JobLauncher jobLauncher, Job job) {
        this.jobLauncher = jobLauncher;
        this.job = job;
    }

    @PostMapping
    public void launchJob(@RequestParam(value = "file_name", required = true) final String fileName) throws Exception {
        final JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
        jobParametersBuilder.addString("fileName", fileName);

        final JobParameters jobParameters = jobParametersBuilder.toJobParameters();

        jobLauncher.run(job, jobParameters);
    }
}

不幸的是,看起来 ItemReader 并不理解要读取的文件名。 该作业“成功”运行,但实际上并未读取我的输入文件。

编辑:我以相同的意图开始了一个新项目,并注意到一旦我使用@StepScope注释,它就会停止工作并且不再工作,即使我删除了@StepScope注释。 现在我想弄清楚如何克服这个

经过一些调试,我注意到我用来读取 excel 文件的 ItemReader 实现( https://github.com/spring-projects/spring-batch-extensions/tree/master/spring-batch-excel )无法读取一旦我开始使用@StepScope批注,我就会立即打开 excel 文件。

所以我发现这个问题PoiItemReader with StepScope Annotation do not read Excel file由 Niraj Sonawane 回答。

基本上我必须将返回类型从ItemReader<Foo>更改为PoiItemReader<Foo>如下:

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

实际上,我有完全相同的方式将路径而不是文件名动态传递给作业:

reader.setResource(new PathResource(path));

一切正常。 也许试试这个。

+请记住,类路径资源必须位于 jar 内。 你的文件在哪里?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM