Разница между Mono / Flux.fromCallable и Mono.defer - PullRequest
1 голос
/ 05 февраля 2020

У меня обычно есть требование генерировать Mono / Flux, значения которого будут сгенерированы / рассчитаны во время подписки. Для этого хорошо подходят операторы fromCallable и defer.

Я не вижу четкой разницы в javado c:

FromCallable:

publi c stati c Mono fromCallable (поставщик Callable)

Создайте Mono, производя его значение, используя предоставленный Callable. Если Callable разрешается в ноль, полученный Mono завершается пустым.

Отсрочка :

publi c stati c Mono defer ( Поставщик> поставщик)

Создайте провайдера Mono, который будет поставлять целевое Mono для подписки для каждого нижестоящего подписчика.

Не могли бы вы объяснить, могут ли оба использоваться для этого требования и что Точная разница между ними?

1 Ответ

2 голосов
/ 06 февраля 2020

Mono.defer обычно используется, когда у вас уже есть Mono из стороннего источника, но вы хотите отложить его создание до времени подписки, потому что во время его создания что-то делается с нетерпением.

Рассмотрим следующий пример:

public static void main(String[] args)
{
    callExternalService()
            .repeat(3)
            .subscribe();
}

private static Mono<?> callExternalService()
{
    System.out.println("External service is called.");

    return Mono.just("result");
}

На первый взгляд, вы можете подумать, что в этом примере нет проблем, но при проверке вывода вы можете увидеть, что External service is called. печатается только один раз, потому что выполняется вне область действия Mono.

Однако, если вы defer выполните Mono, он будет напечатан четыре раза, как и ожидалось:

Mono.defer(() -> callExternalService())
    .repeat(3)
    .subscribe();

В заключение, это действительно очень похоже на fromCallable, но в основном используется, когда у вас уже есть метод, который возвращает Mono и делает что-то нетерпеливое. Если у вас есть полный контроль над кодом, то у вас все в порядке с fromCallable.

...