1

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

我有如下代码。

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

员工存储库具有以下代码

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

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

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

4

1 回答 1

1

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

当您想在固定时间内对对象/数据进行转换时,应使用映射。同步完成的操作。例如,您的 BeanUtils 复制属性操作。

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

“我如何处理找不到给定的员工?” - findById 在未找到时返回空单声道。所以我们可以在这里使用 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));

  }
于 2020-07-10T07:16:46.260 回答