gpt4 book ai didi

spring-webflux - Mono/Flux.fromCallable 和 Mono.defer 的区别

转载 作者:行者123 更新时间:2023-12-03 14:08:05 29 4
gpt4 key购买 nike

我通常需要生成一个 Mono/Flux,其值将在订阅时生成/计算。为此, fromCallable 和 defer 运算符似乎都很好。

我无法在 javadoc 中清楚地看到差异:

FromCallable:

public static Mono fromCallable(Callable supplier)

Create a Mono producing its value using the provided Callable. If the Callable resolves to null, the resulting Mono completes empty.



推迟 :

public static Mono defer(Supplier> supplier)

Create a Mono provider that will supply a target Mono to subscribe to for each Subscriber downstream.



您能否解释一下两者是否都可以用于此要求以及它们之间的确切区别是什么?

最佳答案

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

关于spring-webflux - Mono/Flux.fromCallable 和 Mono.defer 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60077499/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com