【问题标题】:Returning Java Object from Mono从 Mono 返回 Java 对象
【发布时间】:2020-11-20 19:02:27
【问题描述】:

我正在尝试从 Mono 获取 Json 字符串。我尝试使用 block() 方法来获取对象,它工作正常,但是当我使用 map/flatmap 时,我没有看到以下代码行被执行。我看到帐户 Mono 不是空的。

private String getJsonString( Mono<Account> account) {
        response.map(it->{
           **// call is not coming here** 
            val json = mapper.writeValueAsString(it)
            System.out.println(son)
        });
    }

我在这里做错了吗?

【问题讨论】:

  • 直到有人询问结果,管道才会执行; map 是懒惰的。
  • 那么如何从单声道获取 json?我正在尝试调用另一种使用 json 字符串插入数据库的方法。我使用了 subscribe() 但这在大多数情况下都会失败。而且还尝试使用 flatmap 相同的问题方法没有被调用。
  • 通常方法是另一种方法应该采用Mono&lt;String&gt; jsonString。如果完全不可能这样做(例如,您使用的数据库没有响应式驱动程序),那么您需要调用 block() 以“退出”响应式上下文并检索您的值。 (我认为您所说的“大部分时间都失败”的意思只是您从管道内部输出并且并不总是看到它。如果您将 sleep 放在您称为 subscribe() 的地方并给它时间运行,你可能已经看到了。)
  • 但是当我在我的控制器中使用 flatMap 来调用处理程序方法时,它会使用对象而不是单声道的服务方法?serviceRequest-->单声道-->对象这是如何工作的?
  • 如果可能,您的服务应该被重构为接受Mono。如果这不可能,您必须致电block() 并传递结果。 (block() 会中断响应式处理,因此它的效率低于传递MonoFlux,但如果您必须使用非响应式服务,那么您就是这样做的。)

标签: java spring java-stream spring-webflux reactor


【解决方案1】:

如果您阅读 official documentation ,您会看到:

在您订阅之前不会发生任何事情

现在明白了,基于spring boot webflux的微服务,订阅者是谁?,看看this stackoverflow question

现在,如果您认为,您可以在同一个服务中拥有blockingreactive 实现,不幸的是,它不能那样工作。为此,您必须了解反应器工作的 事件循环 模型。因此,在流程中的任何一点调用 block 方法没有好处,相当于使用旧的阻塞 spring-web 方法。 因为正在处理请求的线程被阻塞并等待 I/O 操作/网络调用的结果。

在评论中提出您的问题:

但是当我在我的控制器中使用 flatMap 来调用处理程序方法时,它会使用对象而不是单声道的服务方法?serviceRequest-->单声道-->对象这是如何工作的?

让我给你一个简单的例子:

假设您有一个员工应用程序,您想在其中获取给定 ID 的员工详细信息。 现在在您的控制器中,您将拥有这样的端点:

@GetMapping("/{tenant}/api/employee/{id}")
  public Mono<ResponseEntity> getEmployeeDetails(@PathVariable("id") Long employeeId) {
    return employeeService.getDetails(employeeId)
        .map(ResponseEntity::ok);
  }

现在为您服务,

  public Mono<EmployeeEntity> getDetails(Long employeeId) {
    return employeeRepository.findById(employeeId);
  }

您的存储库将如下所示:

@Repository
public interface EmployeeRepository extends ReactiveCrudRepository<EmployeeEntity, Long> {

}

【讨论】:

    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 2020-10-05
    • 2017-07-31
    • 2015-11-15
    • 1970-01-01
    • 2020-02-08
    • 2020-06-17
    • 2011-01-01
    相关资源
    最近更新 更多