Spring 数据 - webflux - 链接请求

Spring data - webflux - Chaining requests

我使用反应式 Mongo 驱动程序和 Web Flux 依赖项

我有如下代码。

  public Mono<Employee> editEmployee(EmployeeEditRequest employeeEditRequest) {
        return employeeRepository.findById(employeeEditRequest.getId())
                .map(employee -> {
                    BeanUtils.copyProperties(employeeEditRequest, employee);
                    return employeeRepository.save(employee) 
                })
    }

Employee Repository 有以下代码

Mono<Employee> findById(String employeeId)
  1. 调用 findById 时线程是否真的阻塞了?我了解 map 中的部分实际上阻塞了线程。

  2. 如果它阻塞,我怎样才能使这段代码完全反应?

  3. 此外,在这种编写代码的反应式范例中,我该如何处理找不到给定员工的情况?

是的,map 是一个阻塞和同步操作,所花费的时间始终是确定性的。

当你想对一个对象/数据进行固定时间的转换时,应该使用Map。同步完成的操作。例如你的 BeanUtils 复制属性操作。

FlatMap 应该用于非阻塞操作,或者简而言之 returns 支持 Mono、Flux 的任何东西。

“我如何处理找不到指定员工?” - findById returns 未找到时为空单声道。所以我们可以在这里使用switchIfEmpty。

现在让我们来看看您可以对代码进行哪些更改:

  public Mono<Employee> editEmployee(EmployeeEditRequest employeeEditRequest) {
    
    return employeeRepository.findById(employeeEditRequest.getId())
        .switchIfEmpty(Mono.defer(() -> {
          //do something
        }))
        .map(employee -> {
          BeanUtils.copyProperties(employeeEditRequest, employee);
          return employee;
        })
        .flatMap(employee -> employeeRepository.save(employee));

  }