Mono :: затем возвращает ноль - PullRequest
0 голосов
/ 13 февраля 2020

Я относительно новичок в реактивном программировании. Мой вопрос касается Mono::then

Что я хочу сделать, это извлечь тело из входящего запроса, установить его в переменную stati c. Как только это будет сделано, отправьте ответ о том, что служба запущена. Но следующий код всегда возвращает «Служба запущена для: null».

Я думал, что Mono::then должен запуститься после завершения первого моно (в данном случае после установки переменной stati c) и вернуть «Служба» началось для: a, b, c ".

Неужели мое понимание неверно?

(Также приветствуется любая критика кода)

public Mono<ServerResponse> getStatus(ServerRequest req) {
        Mono<List<Request>> body = req.bodyToFlux(Request.class).collectList();
        return ServerResponse.ok()
                .body(body.doOnNext(i -> {
                    Service.a = i;
                    logger.info("Service started for : {}", i.toString());
                })


                        .then(Mono.just("Service started for: " + Service.a)), String.class);
    }

1 Ответ

1 голос
/ 15 февраля 2020

Общение через переменные c очень не рекомендуется (особенно в функциональном и реактивном программировании). Поскольку в вашем вопросе вы не предоставили достаточно информации о Service, который вы начинаете, рекомендовать его немного сложно.

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

public Mono<ServerResponse> getStatus(ServerRequest req) {
    return req.bodyToFlux(Request.class)
            .collectList()
            .doOnNext(requestBody -> System.out.println("Do your service start here in the background."))
            .flatMap(requestBody -> ServerResponse.ok().syncBody("Service started for: " + requestBody));
}
...