Webflux Mono - продолжайте работать до завершения - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть функция, которая делает кучу вещей и в конечном итоге возвращает Mono.

Если у меня есть такой обработчик:

fun handleSomething(request: ServerRequest): Mono<ServerResponse> {
  return longRunningMethod().flatMap {
    ServerResponse.ok.build()
  }
}

Это сработает, но не вернет ответ, пока не завершит длительный метод.

Вместо этого я хотел бы запустить метод длительного запуска, но немедленно вернуть ответ, что-то вроде этого:

fun handleSomething(request: ServerRequest): Mono<ServerResponse> {
  longRunningMethod()

  return ServerResponse.ok.build()
}

Проблема в том, что как только ответ отправлен (что в основном происходит сразу), кажется, что он просто прерывает longRunningMethod().

Есть ли способ сохранить longRunningMethod() работающим до его фактического завершения, даже если запрос завершен?

1 Ответ

0 голосов
/ 14 сентября 2018

Трудно сказать наверняка, потому что мы упускаем много контекста здесь.

Но я думаю, что эта задача (которая, кажется, генерирует отчет) не связана строго с Контроллером, и это может не относиться к этому. Вместо этого вы можете отправить событие приложения с вашего контроллера и позволить обработчику событий обработать его.

По умолчанию события обрабатываются в текущем потоке, поэтому вы должны обязательно настроить Executor с этим ApplicationEventMulticaster. В конце концов, кажется, что не имеет значения, создается ли отчет или нет, с точки зрения HTTP, поэтому вы можете полностью отделить их.

Теоретически, вы могли бы сделать longRunningMethod().subscribe(), но было бы неправильно, если бы этот побочный эффект запускался с контроллера, без проверок. И это также будет сложнее проверить.

...