java - Spring Batch - 如何使用从 REST API 请求收到的文件名启 Action 业

标签 java excel spring rest spring-batch

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

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

我已经阅读了一些有关如何通过 Rest API 启 Action 业以及 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();
    }

}

还有我的 Controller :

@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 注释。现在我正在想办法克服这个问题

最佳答案

经过一些调试,我注意到当我开始使用 @StepScope 时,我用来读取 Excel 文件的 ItemReader 实现 ( https://github.com/spring-projects/spring-batch-extensions/tree/master/spring-batch-excel ) 无法读取 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;
}

关于java - Spring Batch - 如何使用从 REST API 请求收到的文件名启 Action 业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56586465/

相关文章:

java - 在 JBoss EAP 7.0.0 中使用 Vault 时出现问题

java - 通过 JNA 使用 CFBooleanRef

java - 如何在java中使用poi自动调整行高?

excel - 使用相对引用将公式从 [1,X] 范围复制到 [Y,X] 范围

spring - 使用 Spring Session 时自定义 cookie 名称

java - JMH中的分配率是什么意思

mysql - 从包含超过 300 列的 csv、txt 或 xls 文件创建 MySQL 表

java - 如何使用 JPA 关系实体创建 RestAPI

java - Spring 将文件映射到 Url/URI

java - 即使我在重新启动后不启动应用程序,我仍然可以看到 BOOT_COMPLETED 吗?