我正在玩Project Reactor,面对着不直观的行为。
举个例子:
Mono.fromCallable(() -> calculate())
//.log()
.publishOn(Schedulers.boundedElastic())
.doOnNext(i -> System.out.println("thread: " + Thread.currentThread().getName()))
.block();
当我取消注解log()
时,calculate()
在main
线程上运行,但当我保留它时,该方法在boundedElastic
上执行。为什么log()
会改变Mono的行为?
1条答案
按热度按时间8i9zcol21#
如果您查看
publishOn
方法的实现,您会注意到它有一个特定的情况,即在Callable
之后立即调用它。在这种情况下,它返回MonoSubscribeOnCallable
,并且在传递给publishOn
的调度程序上执行可调用。这就是为什么你会看到这样的行为。但是,如果在
fromCallable
和publishOn
之间添加.log
运算符,则不适用此特殊情况。这是因为this
指针现在引用MonoLogFuseable
,因此,MonoPublishOn
以默认行为返回。以下是引入此更改的提交:https://github.com/reactor/reactor-core/commit/41d9dae7256ffc36a07db7a9f5fa4d95182a5ad9
不幸的是,我找不到任何票据参考或解释,以清楚地理解为什么它的工作方式。