spring - 将动态资源注入(inject) Spring Batch ItemReader

标签 spring spring-boot spring-batch

我编写了一个自定义项目阅读器,它需要从休息端点动态接受资源。 它从字节码读取文件。

public class CustomItemReader implements ItemReader<File> {

    @Setter
    private MyResourceModel resource; //simple pojo that includes byte codes and file name;

    @Override
    public File read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        //converting resource to file;
    }
}

在我最近回顾的许多示例中,配置中注入(inject)的资源意味着静态,但在我的情况下,我必须将其注入(inject)到我的 Controller 上。

为了做到这一点,我将我的阅读器注入(inject)到 Controller 中,并将资源注入(inject)到该阅读器中。

这是我启动此 bean 的配置;

@Configuration
public class MyStepConfig {

    @Bean("customItemReader")
    public CustomItemReader reader() {
        CustomItemReader reader = new CustomItemReader();
        //reader.setResource(resource);  // in many code resource is injected here but i need to inject in endpoint method.
        return reader;
    }

    @Bean("myStep")
    public Step step() {
        //inject reader to step...
    }
}

Controller 在下面;

@RestController
public class MyController {

    @Qualifier("customItemReader")
    private CustomItemReader customItemReader;

    @PostMapping("/upload-file")
    public ResponseEntity uploadFile(@RequestBody MyResourceModel resource) {
        customItemReader.setResource(resource);

        //launch job

        return ResponseEntity.ok().build();
    }
}

它有效,但我不知道这是正确的方法吗? 最好的方法是什么?

最佳答案

您当前的解决方案不是线程安全的(如果有两个启 Action 业的请求,第二个请求将更改第一个作业的资源模型)。

我建议将您的阅读器创建为作业范围 bean,并通过作业参数传递所需的配置:

  @Bean("customItemReader")
  @JobScope
  public CustomItemReader reader(@Value("#{jobParameters['param']}") String param) {
    CustomItemReader reader = new CustomItemReader(param);
    //reader.setResource(resource);  // in many code resource is injected here but i need to inject in endpoint method.
    return reader;
  }

关于spring - 将动态资源注入(inject) Spring Batch ItemReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56206844/

相关文章:

java - Spring批处理ItemReader对同一条记录执行多次

java - Spring Autowiring 不起作用

spring - Spring 和 Spring Boot 的区别

java - 如何获得itemWriter创建文件?

java - 创建名为 'webSecurityConfig' 的 bean 时出错,因为当我尝试将 UserService Bean Autowiring 到 WebSecurityConfig 中时,它不存在

java - 我的 Spring 应用程序无法识别我的网络服务

java - Spring boot : Managing bean scope "manually" for dynamically creating beans at runtime with differing states. 我们的解决方案有问题吗?

java - 是否可以在 Spring Batch 中结合分区和并行步骤?

java - Spring 批处理 : How do I return custom exit code on invalid record with exception in spring batch

java - Maven 可以做我们在这个 ANT build.xml 中所做的事情吗