Spring webflux, как вернуть 200 ответ клиенту перед обработкой большого файла - PullRequest
0 голосов
/ 24 января 2020

Я работаю над проектом Spring Webflux,

Я хочу сделать что-то вроде: Когда клиент делает вызов API, я хочу отправить сообщение об успешном выполнении клиенту и выполнить операцию с большим файлом в фоновом режиме.

Таким образом, клиенту не нужно ждать, пока весь мой файл будет обработан.

Для тестирования я сделал пример кода, как показано ниже

REST controller

@GetMapping(value = "/{jobId}/process")
  @ApiOperation("Start import job")
  public Mono<Integer> process(@PathVariable("jobId") long jobId) {
    return service.process(jobId);
  }

Файл Служба обработки

public Mono<Integer> process(Integer jobId) {
    return repository
        .findById(jobId)
        .map(
            job -> {
              File file = new File("read.csv");
              return processFile(file);
            });
  }

Вот мой стек

Spring Webflux 2.2.2.RELEASE

Я пытаюсь сделать этот вызов, используя WebClient, но пока весь файл не обработан Я не получаю ответ.

Может кто-нибудь, пожалуйста, помогите мне.

Спасибо

Alpe sh

Ответы [ 2 ]

1 голос
/ 25 января 2020

Вы можете использовать метод subscribe и начать задание с собственной областью в фоновом режиме.

Mono.delay(Duration.ofSeconds(10)).subscribeOn(Schedulers.newElastic("myBackgroundTask")).subscribe(System.out::println);

Пока вы не отправите это ie своему издателю ответов, используя один из zip / merge или аналогичные операторы, ваша работа будет выполняться в фоновом режиме в своем собственном пуле планировщиков.

subscribe() метод возвращает экземпляр Disposable, который впоследствии может быть использован для отмены фоновой работы путем вызова dispose() метод.

1 голос
/ 25 января 2020

В качестве одного из параметров вы можете запустить обработку в другом потоке.

Например:

  1. Создать Event Listener Ссылку

  2. Включить @Async и @EnableAsync Ссылка

Или использовать разные типы Исполнители из Java пакета параллелизма

Или вручную запустить поток

Также для Kotlin можно использовать Сопрограммы

...