微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何停止主线程来完成所有Mono调用?

如何解决如何停止主线程来完成所有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 举报,一经查实,本站将立刻删除。