Моно класс в Java: что и когда использовать? - PullRequest
2 голосов
/ 16 марта 2020

У меня есть следующий код:

import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;

@Component
public class GreetingHandler 
    public Mono<ServerResponse> hello(ServerRequest request) {
        return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
        .body(BodyInserters.fromValue("Hello Spring!"));
    }
}

Я понимаю этот код, за исключением того, что делает класс Mono и каковы его особенности. Я много занимался поиском, но он не пошел прямо к делу: что такое класс Mono и , когда его использовать ?

1 Ответ

0 голосов
/ 16 марта 2020

A Mono<T> - это специализированный Publisher<T>, который излучает не более одного элемента, а затем (опционально) завершается сигналом onComplete или onError. Он предлагает только подмножество операторов, доступных для Flux, и некоторые операторы (особенно те, которые объединяют Mono с другим Publisher), переключаются на Flux. Например, Mono#concatWith(Publisher) возвращает Flux, а Mono#then(Mono) возвращает другое Mono. Обратите внимание, что вы можете использовать Mono для представления асинхронных процессов без значения, которые имеют только концепцию завершения (аналогично Runnable). Чтобы создать его, вы можете использовать пустой Mono<Void>.

Mono и Flux - оба реактивные потоки. Они отличаются тем, что они express. Mono - это поток от 0 до 1 элемента, тогда как Flux - это поток от 0 до N элементов.

Это различие в семантике этих двух потоков очень полезно, например, для запроса к Http-сервер ожидает получения 0 или 1 ответа, в этом случае было бы нецелесообразно использовать Flux. Наоборот, при вычислении результата математической функции на интервале ожидается один результат на число в интервале. В этом другом случае целесообразно использовать Flux.

Как его использовать:

Mono.just("Hello World !").subscribe(
  successValue -> System.out.println(successValue),
  error -> System.error.println(error.getMessage()),
  () -> System.out.println("Mono consumed.")
);
// This will display in the console :
// Hello World !
// Mono consumed.

// In case of error, it would have displayed : 
// **the error message**
// Mono consumed.

Flux.range(1, 5).subscribe(
  successValue -> System.out.println(successValue),
  error -> System.error.println(error.getMessage()),
  () -> System.out.println("Flux consumed.")
);
// This will display in the console :
// 1
// 2
// 3
// 4
// 5
// Flux consumed.

// Now imagine that when manipulating the values in the Flux, an exception
// is thrown for the value 4. 
// The result in the console would be :
// An error as occured
// 1
// 2
// 3
//
// As you can notice, the "Flux consumed." doesn't display because the Flux
// hasn't been fully consumed. This is because the stream stop handling future values
// if an error occurs. Also, the error is handled before the successful values.

sources: Reactor Java # 1 - Как создать Mono и Flux? , Mono, асинхронный результат 0-1

это может быть полезно: Mono do c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...