我可以使用 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>
,然后您将使用 map
或 flatMap
运算符对其执行转换。
** 编辑 **
如果您希望在反应流中进行阻塞调用,之前的 包含一个很好的答案
抱歉,我是反应式范式的新手。可以使用 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>
,然后您将使用 map
或 flatMap
运算符对其执行转换。
** 编辑 **
如果您希望在反应流中进行阻塞调用,之前的