Когда реактор выполняет подписную цепочку? - PullRequest
0 голосов
/ 09 марта 2020

Реактор Документация гласит следующее:

Ничего не произойдет, пока вы не подпишетесь

Если это правда, почему я вижу java.lang.NullPointerException когда я запускаю следующий фрагмент кода, в котором есть цепочка реакторов без подписки?

    @Test
    void test() {
        String a = null;
        Flux.just(a.toLowerCase())
                .doOnNext(System.out::println);
    }

1 Ответ

2 голосов
/ 09 марта 2020

Дипак,

Ничего не происходит означает, что данные не будут передаваться по цепочке ваших функций вашим потребителям, пока не произойдет подписка.

Вы получаете NPE потому что Java пытается вычислить значение, которое присваивается оператору hot just() на шаге определения потока.

Вы также можете преобразовать just() в cold operator с использованием defer(), поэтому вы получите NPE только после подписки:

public Flux<String> test() {
    String a = null;
    return Flux.defer(() -> Flux.just(a.toLowerCase()))
            .doOnNext(System.out::println);
}

Пожалуйста, прочитайте больше о hot vs hold операторов.

Обновление:

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

Mono<Date> currentTime = Mono.just(Calendar.getInstance().getTime());
Mono<Date> realCurrentTime = Mono.defer(() -> Mono.just(Calendar.getInstance().getTime()));

// 1 sec sleep
Thread.sleep(1000);
currentTime.subscribe(time -> System.out.println("Current Time " + time.getTime()));
realCurrentTime.subscribe(time -> System.out.println("Real current Time " + time.getTime()));

Thread.sleep(2000);
currentTime.subscribe(time -> System.out.println("Current Time " + time.getTime()));
realCurrentTime.subscribe(time -> System.out.println("Real current Time " + time.getTime()));

Выход:

Текущее время 1583788755759

Реальное текущее время 1583788756826

Текущее время 1583788755759

Реальное текущее время 1583788758833

...