我可以使用 AtomicReference 来获取 Mono 的值并且代码仍然保持反应性吗

Can I use AtomicReference to get value of a Mono and code still remain reactive

抱歉,我是反应式范式的新手。可以使用 AtomicReference 来获取 Mono 的值,因为反应式代码可以 运行 异步并且不同线程上的不同事件 运行 。请参阅下面的示例。我也不确定这段代码是否被认为是反应性的

示例代码:

public static void main(String[] a) {
  AtomicReference<UserDTO> dto = new AtomicReference<>();
  Mono.just(new UserDTO())
      .doOnNext(d -> d.setUserId(123L))
      .subscribe(d -> dto.set(d));
  UserDTO result = dto.get();
  dto.set(null);
  System.out.println(result); // produce UserDTO(userId=123)
  System.out.println(dto.get()); // produce null
}

不能保证您分享的代码片段始终有效。没有办法保证 doOnNext 里面的函数会在 dto.get() 之前发生。您已经创建了竞争条件。

你可以运行下面的代码来模拟这个。

    AtomicReference<UserDTO> dto = new AtomicReference<>();
    Mono.just(new UserDTO())
            .delayElement(Duration.ofSeconds(1))
            .doOnNext(d -> d.setUserId(123L))
            .subscribe(dto::set);
    UserDTO result = dto.get();
    System.out.println(result); // produces null

为了让这个例子完全反应,你应该在 subscribe 运算符

中打印出来
Mono.just(new UserDTO())
        .doOnNext(d -> d.setUserId(123L))
        .subscribe(System.out::println)

在一个更“真实世界”的示例中,您的方法将 return 一个 Mono<UserDTO>,然后您将使用 mapflatMap 运算符对其执行转换。

** 编辑 **

如果您希望在反应流中进行阻塞调用,之前的 包含一个很好的答案