Project Reactor - 如何检查 Mono<Void> 是否确实被调用?

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

我是反应式编程的新手(我读过很多类似的问题)。

在我当前的宠物项目中,我遇到了以下问题(我为相关场景提供伪代码)。

它涉及过滤

Mono<Object>
,然后确定
Mono<Void>
是否被调用。 在下面的例子中:

  1. 我根据输入创建
    Mono<String>
  2. 过滤器,如果输入
    String resource
    适合我的方法。
  3. 将我的
    Mono<String>
    平面映射到长期运行的
    Mono<Void>
    。它更改了一些内部系统属性,但不返回任何内容
  4. 如果
    service.loadSmth
    被执行并成功完成,我想打电话给
    serviceContinueWork.doSmthElse()
    .
public Mono<Void> execute(String resource) {
        return Mono.just(resource) //Mono<String>
                .filter(Objects::nonNull) //Mono<String>
                .filter(msg -> msg.startsWith("http://")) //filtering the Mono<String>
                .flatMap(msg -> service.loadSmth(msg)) //flat map to Mono<Void>
                .doOnSuccess(command -> serviceContinueWork.doSmthElse()) //!!! executed always :(
                .doOnError(t -> log.error("service#loadSmth error: {}", ExceptionUtils.getStackTrace(t)))
                .then();
    }

但是,无论字符串是否被过滤,都会调用 doOnSuccess。据我了解,空 Mono 被认为已成功终止。

我的问题是 - 这种情况的模式是什么。 (当我们想要确定

Mono<Void>
是否被调用时 -
doOnNext
doOnSuccess
不合适)。

据我了解,我总是可以切换到

service.loadSmth(msg)
返回
Mono<Boolean>
- 然后
doOnNext
而不是
doOnSuccess
就可以正常工作了。

然而,似乎应该有某种方法来区分这些情况,而无需进行不必要的签名更改。我需要知道是否已在外部调用代码中“从外部”调用了方法。 就像,我不会让“void doSmth()”方法返回布尔值,只是为了知道它是否已被调用(在通常的、非反应性/非功能性的情况下)。

将不胜感激任何建议/链接。

java functional-programming spring-webflux project-reactor
1个回答
0
投票

发布@MartinTarjányi 评论的答案。对我有用的伪代码:

public Mono<Void> execute(String resource) {
        return Mono.just(resource) 
                .filter(Objects::nonNull) 
                .filter(msg -> msg.startsWith("http://")) 
                .flatMap(msg -> service
                        .loadSmth(msg)
                        .onSuccess((v) -> serviceContinueWork.doSmthElse()))
                .doOnError(t -> log.error("service#loadSmth error: {}", ExceptionUtils.getStackTrace(t)))
                .then();
    }
© www.soinside.com 2019 - 2024. All rights reserved.