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