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
.