Внедрить динамический ресурс в Spring Batch ItemReader - PullRequest
0 голосов
/ 19 мая 2019

Я написал программу чтения пользовательских элементов, которая должна динамически принимать ресурс с конечной точки покоя.Он читает файл из байтового кода.

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

во многих примерах, которые я недавно просматривал, ресурс вводится в конфиге, что означает статически, но в моем случае я должен внедрить его на свой контроллер.

Чтобы сделать это, я ввожу свой считыватель в контроллер и внедряю ресурсы этому считывателю.

это конфигурация, в которой я инициирую этот компонент;

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

Это работает, но я не знаю, это правильный путь?Каков наилучший способ сделать это?

1 Ответ

1 голос
/ 19 мая 2019

Ваше текущее решение не является поточно-ориентированным (если есть два запроса на запуск задания, второй запрос изменит модель ресурса для первого задания).

Я бы посоветовал создать ваш читатель как компонент объема работ и передать требуемую конфигурацию параметрами задания:

  @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;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...