在组装阶段仅订阅发布者并保持不变是否安全?

问题描述 投票:0回答:1

我已经在 Gitter 中询问过,但看起来这几天不太活跃..

我很好奇,在生产代码中使用此类构造是否安全:

private Mono<Void> someHandler() {
        someService.registerPlayer(internalPlayer)
                        .subscribe();

        return Mono.empty();
    }

然后只需使用 WebFlux 控制器方法中的

Publisher
即可?

官方文档中有相关内容吗?我在参考文献中找到的所有示例似乎都是从阻塞代码调用反应式代码并观察行为的示例。

我想这里返回的Disposable很快就会被GC回收,对吧? 以及实现类似结果的正确方法是什么(在外部

Publisher
上发射,而不必等到内部
Publisher
完成;但确保它已完成)

java spring spring-boot spring-webflux project-reactor
1个回答
1
投票

如果我理解正确的话,那么这基本上是一个“一劳永逸”的场景,但是没有什么可以阻止您在该链上使用其他运算符来处理结果。

如果通过 “确信订阅将完成”,您的意思是 “如果成功完成则执行某些操作”“如果完成但有错误则执行某些操作” 那么:

如果您想在单独的线程中启动某些处理并立即返回,并且对完成该单独的处理充满信心,那么您可以同时使用 subscribeOn() 并将一些运算符放入该链中以处理成功的结果或该处理的错误,就像您构建任何反应链时所做的那样。

要处理您可以使用的结果,例如,

.map()

doOnNext()
flatMap()
switchIfEmpty()
等,只要符合您的要求,
要处理错误,您可以使用例如 

onErrorResume()

onErrorContinue()
onErrorMap()
onErrorReturn()
doOnError()
等),只要符合您的要求即可。
这是一个示例:

private Mono<Void> someHandler() { someService.registerPlayer(internalPlayer) // handle results .doOnNext(...) // handle errors .orErrorResume(...) // the whole subscription process will happen on the thread provided by the Scheduler you specified .subscribeOn(Schedulers.boundedElastic()) .subscribe(); // return immediately return Mono.empty(); }

© www.soinside.com 2019 - 2024. All rights reserved.