当前位置: 首页 > 知识库问答 >
问题:

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

诸葛嘉熙
2023-03-14

对不起,我对反应范式还不熟悉。可以使用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
}

共有1个答案

沈皓君
2023-03-14

您共享的代码段不能保证始终有效。无法保证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

要使此示例完全响应,您应该在订阅运算符中打印出来

Mono.just(new UserDTO())
        .doOnNext(d -> d.setUserId(123L))
        .subscribe(System.out::println)

在一个更“真实的世界”示例中,您的方法将返回一个Mono

**编辑**

如果您希望在反应流中进行阻塞调用,那么前面的堆栈溢出问题包含了一个很好的答案

 类似资料:
  • 问题内容: 是否可以输入字符并取回unicode值?例如,我可以在HTML中输入&#12103以输出“⽇”,是否可以将该字符作为函数的参数并获得数字作为输出而无需构建unicode表? 还是相反? 我希望能够将实际字符输出到页面上而不是代码中,并且如果可能的话,我也希望能够从字符中获取代码。我最想要的是php.net/manual/en/function.mb- decode-numericent

  • 完整的请求链是: > : 或(似乎无关紧要): ,因为此时站点是相同的,并且浏览器显示cookie 对于用户上次加载的页面不在上的一般情况,我赞赏将呈现给的CSRF潜力,但我只是将其从设置,现在我是重定向到的人。 当然,我可以设置,但是如果有人可以找到某种方法通过错误地创建URL来触发他们从我的站点选择的重定向,那么就不会有点击劫持的可能吗?

  • 问题内容: 我正在做与此问题类似的事情,在此我有一个复选框列表作为自定义编辑控件。区别在于我想从服务器获取列表(不是在客户端使用 Check1,Check2,Check3进行 硬编码)。 在列设置或 custom_element 函数中,有什么方法可以这样做吗? 似乎我需要与用于选择项的 dataUrl 属性类似的 东西 ,但这似乎仅适用于选择项(不适用于自定义项)。 有什么建议? 问题答案: 您

  • 问题内容: 如果我有这个: 如果可能的话,如何在不实际调用方法的情况下获得对f.bar的引用? 编辑添加:我想做的是编写一个对f的成员进行迭代并对其执行某些操作的函数(不重要)。属性让我感到震惊,因为仅在getattr()中命名它们会调用其__get __()方法。 问题答案: (下图)在给定对象的中查找,如果存在则返回关联的值。如果不是其中的关键,则搜索对象的MRO 。如果找不到密钥,则引发。

  • 我收到了这个错误:“WebDriverException:消息:'chromedriver'可执行文件需要在路径中。”我能够修复它的唯一方法是手动添加chromedriver的一个位置,如下所示: Chrome启动后,我收到了这个错误:“您使用的是不受支持的命令行标志:--忽略认证错误。稳定性和安全性将受到影响。” 我想尝试使用以下代码来解决这个新错误,但我不知道如何/是否可以将其与手动指定chr

  • 我想要一个像我公司一样的套餐。bindy中的几个类都用bindy注释注释。然后,我希望有Camel路由可以将CSV解组为其中一种类型。我已经完成了所有工作,但如果包中有多个bindy注释类,则解组失败。这是因为Bindy试图将CSV行解组到包中的每个类中。并且一个特定的行不能正确地编组到多个类中。我的数据格式在Spring中声明如下: