Данные Spring - webflux - Объединение запросов - PullRequest
1 голос
/ 10 июля 2020

Я использую реактивный Mon go Драйверы и зависимости 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? Я понимаю, что часть карты фактически блокирует поток.

  2. если он блокируется, как я могу сделать этот код полностью реактивным?

  3. Кроме того, в этой реактивной парадигме написания кода, как мне справиться с тем, что данный сотрудник не найден?

1 Ответ

1 голос
/ 10 июля 2020

Да, карта - это блокирующая и синхронная операция , для которой всегда будет определено время c.

Карта должна использоваться, когда вы хотите сделать преобразование объекта / данных в фиксированное время. Операции, выполняемые синхронно. например, ваша операция копирования свойств 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));

  }
...