如何解决如何停止主线程来完成所有Mono调用?
我正在对数据库进行多个单声道调用,并且需要所有单声道响应的结果来计算最终结果,该最终结果将在声明的单声道逻辑之后写入。
if (SomeObject.getAccountLevelActiveList() != null) {
SomeObject.getAccountLevelActiveList().parallelStream().forEach(account -> {
Mono<SubLine> subLineMono= SubLineservice
.getLineLevelCustProfile(preNbsLineLevelConverter.getSubLine(account ));
subLineMono.subscribe(subLine-> PollObject.getSubList()
.put(accountLevelMtn.getMtn(),Optional.ofNullable(subLine)));
});
}
但是在将单声道结果存储到 PollObject 之前,我的主要逻辑正在执行。因此我在 PollObject 中得到的是null。因此,我想停止主线程,直到将Mono结果存储到 PollObject 。
解决方法
如果要停止主线程,则可以使用阻塞而不是订阅,但是必须首先将List
转换为Flux
,然后再使用提供的{{1 }}。您可以将flatMap
方法中拥有的逻辑移到Mono
或包装subscribe
的副作用运算符doOnNext
中:
Mono
如果不需要Flux
之后的代码在主线程中运行,则最好保持反应性,因为已经建议了@ chrylis-cautiouslyoptimistic。使用Flux.fromIterable(SomeObject.getAccountLevelActiveList())
.flatMap(account ->
SubLineService.getLineLevelCustProfile(
preNbsLineLevelConverter.getSubLine( account ))
).doOnNext(subLine ->
PollObject.getSubList().put(accountLevelMtn.getMtn(),Optional.ofNullable(subLine))
).blockLast();
// the following code will be executed first when all monos are completed
运算符将所有结果放在一起,以产生在提供的所有Monos完成时完成的mono:
if
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。