我通常需要生成一个Mono/Flux,它的值将根据订阅时间来生成/计算。对于这一点,fromCallable和延迟运算符似乎都很好。
我无法清楚地看到javadoc中的区别:
FromCallable:
公共静态Mono fromCallable(可调用供应商)
使用提供的可调用创建一个生成其值的Mono。如果可调用解析为null,则生成的Mono将完成空。
延迟
公共静态单次延迟(Supplier>供应商)
创建一个Mono提供者,它将为每个下游订阅者提供一个要订阅的目标Mono。
你能解释一下这两种要求是否都可以用于这一要求吗?它们之间有什么确切的区别?
发布于 2020-02-06 10:41:27
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();
defer
的另一个用例是您想要测试一个重复/重试/重新订阅逻辑,并且您希望对返回Mono
的模拟服务有不同的返回值。
总之,它确实非常类似于fromCallable
,但大多数是在您已经有了返回Mono
并执行一些迫切任务的方法时使用的。如果您对代码有完全的控制,那么您完全可以使用fromCallable
。
https://stackoverflow.com/questions/60077499
复制相似问题