【问题标题】:Inject Dynamic resource to Spring Batch ItemReader将动态资源注入 Spring Batch ItemReader
【发布时间】:2019-10-05 23:48:32
【问题描述】:

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

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

在我最近查看的许多示例中,配置中注入的资源是静态的,但在我的情况下,我必须将其注入到我的控制器上。

为了做到这一点,我将阅读器注入控制器,并将资源注入此阅读器。

这是我启动这个 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...
    }
}

控制器在下方;

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

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

【问题讨论】:

  • 我投票结束这个问题,因为这是一个关于代码审查的问题,应该在Code Review
  • @Jens 好的,我不知道这种问题应该在codereview.stackexchange.com 提问。我会在那里问。谢谢。

标签: spring spring-boot spring-batch


【解决方案1】:

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

我建议将您的阅读器创建为作业范围 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;
  }

【讨论】:

  • 谢谢,我了解线程安全解决方案,但参数是什么?我应该在哪里注射?我的阅读器没有参数字段。
  • 您应该在作业启动期间传递参数。它们保存在数据库中,因此您不能在那里传递复杂的对象。您应该重新设计您的 CustomItemReader 以允许使用简单类型进行构造并通过参数将它们全部传递(这只是一个参数的示例)。阅读更多docs.spring.io/spring-batch/trunk/reference/html/…
猜你喜欢
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多