如何在反应链中传递数据

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

每当我需要在反应链中传递数据时,我最终会做这样的事情:

public Mono<String> doFooAndPassDtoAsMono(Dto dto) {
    return Mono.just(dto)
        .flatMap(dtoMono -> {
            Mono<String> result = // remote call returning a Mono
            return Mono.zip(Mono.just(dtoMono), result);
        })
        .flatMap(tup2 -> {
            return doSomething(tup2.getT1().getFoo(), tup2.getT2()); // do something that requires foo and result and returns a Mono
        });
}

鉴于以下示例Dto类:

class Dto {
    private String foo;

    public String getFoo() {
        return this.foo;
    }
}

因为将数据一直传递到链条上(特别是几个级别)往往会很繁琐,我想知道是否可以像这样直接引用dto

public Mono<String> doFooAndReferenceParam(Dto dto) {
       Mono<String> result = // remote call returning a Mono
        return result.flatMap(result -> {
            return doSomething(dto.getFoo(), result); // do something that requires foo and result and returns a Mono
        });
}

我对第二种方法的关注是假设订阅者在线程池上订阅了这个Mono,我需要保证Dto是线程安全的(上面的例子很简单,因为它只带有String,但如果不是这样的话)?

另外,哪一个被认为是“最佳实践”?

project-reactor
2个回答
0
投票

根据您分享的内容,您可以简单地执行以下操作:

public Mono<String> doFooAndPassDtoAsMono(Dto dto) {
    return Mono.just(dto.getFoo());
}

您在第一个选项中使用zip的方式无法解决任何问题。同样,第二个选项也不起作用,因为一旦单声道为空,则不会触发下一个平面地图。


0
投票

案件很简单,如果

  • 参考数据从一开始就可以获得(即在创建链之前),和
  • 该链创建用于处理最多一个事件(即以Mono开头),和
  • 参考数据是不可变的。

然后,您可以简单地在参数或局部变量中引用参考数据 - 就像在第二个解决方案中一样。这完全没问题,并且没有并发问题。


强烈建议不要在反应流中使用可变数据。如果你有一个可变的Dto类,你仍然可以使用它(假设正确的同步) - 但这对你的代码的读者来说是非常令人惊讶的。

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