Spring Webflux / Reactor выпускает вызывающую нить - PullRequest
0 голосов
/ 09 марта 2019

Итак, я понимаю, что под капотом Spring WebFlux и Reactor используют netty для nio, теперь я хотел бы освободить вызывающий поток, чтобы освободить ресурсы для обработки большего количества запросов.Приведенный ниже простой код освобождает вызывающий поток?

@GetMapping("/foo")
public Mono<Void> bar() {

  someService.veryLongSyncOperation();

  return Mono.empty();
}

Я не обернул служебный вызов в Flux / Mono, я просто хочу сначала убедиться, что вызывающий поток освобожден, пока служба выполняет свою долгую работу.Этого достаточно, чтобы добиться освобождения вызывающего потока?Если да, есть ли способ проверить это?

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

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Вы можете использовать .subscribeOn(Schedulers.elastic()), как указано в справочном руководстве по реактору

@GetMapping("/foo")
public Mono<Void> bar() {
    return Mono.fromCallable(() -> someService.veryLongSyncOperation())
            .subscribeOn(Schedulers.elastic())
            .then();
}

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

0 голосов
/ 09 марта 2019

Нет.В этом случае вы вызываете длительный процесс в потоке ввода-вывода Netty.Самый простой способ, о котором я могу подумать, это создать приемник Mono и запустить длинную операцию в новом потоке (или, возможно, через пул потоков).Когда операция завершается успешно, вы вызываете sink.success(), а в случае сбоя вы вызываете sink.error(x), передавая выброшенное исключение.

@GetMapping("/foo")
public Mono<Void> bar() {
    return Mono.create(sink -> {
        new Thread(() -> {
            try {
                someService.veryLongSyncOperation();
                sink.success();
            } catch (Exception ex) {
                sink.error(ex);
            }
        }).start();
    });  
}

Вызывающий поток возвращается сразу после настройки потока, и WebFlux выполнитподписаться на возвращенный Mono, что приведет к запуску потока в новом потоке.

...