Является ли предпочтительным использование плоской карты несколько раз в одной трубе Mono <Object> - PullRequest
0 голосов
/ 13 октября 2018

Как часть команды разработчиков, мы хотим создать неблокирующее приложение, для которого мы создаем наше приложение с использованием Spring Reactor 3. Поэтому при использовании проектного реактора у меня есть список вопросов:

  1. Является ли хорошей практикой использование нескольких flatMap в одном канале и на Mono<object>, например, если существует сценарий проверки информации emp, если все детали emp действительны:

    @Getter
    @Setter
    public class Employee {
         private long empId;
         private String userName;
         private String password;
    
    }
    public class FlatMapExample{
    public Mono<Emplyoee> doValidate(Emplyoee emp){
    
        Mono.just(emp).flatMap(this::validateEmpId)
              .flatMap(this::validateUserName)
              .flatMap(this::validatePassword);
    }
    private Mono<Emplyoee> validateEmpId(Emplyoee e){
     Mono.just(emp).flatMap(//here some check on empId)
    }
    
    private Mono<Emplyoee> validateUserName(Emplyoee e){
     Mono.just(emp).flatMap(//here some check userName calling another method which is performing some extra checks like the format of username/ null or empty userName)
    }
    
    private Mono<Emplyoee> validatePassword(Emplyoee e){
     Mono.just(emp).flatMap(//here some check to validate password by calling another method)
    }
    
    }
    
  2. Стоит ли flatMap дороже с точки зрения ресурсов по сравнению с картой?

  3. Если мы будем использовать карту, то метод, вызываемый внутри карты, должен возвращать простойобъект, например, в вышеупомянутом случае, если мы использовали карту, тогда тип возвращаемого значения validateEmpId и другие методы будут только Employee.Таким образом, в этих методах мы не можем использовать канал, это будет простая Java или мы можем использовать потоки Java.Так что, на мой взгляд, это не будет функциональное программирование.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Я думаю, вы должны попытаться упростить ваш валидный API, например:

public Mono<Void> doValidate(Emplyoee emp){
  return validateEmpId(emp.getId())
    .then(validateUserName(emp.getUserName()))
    .then(validatePassword(emp);
}
private Mono<Void> validateEmpId(long id){
  // here some check on empId

  // if check ok return Mono.empty()
  // else return Mono.error(new YourException(...))
}
private Mono<Void> validateUserName(String userName){
  ...
}
private Mono<Void> validatePassword(Emplyoee emp){
  ...
}

Не более Mono.just(emp).flatMap.

0 голосов
/ 13 октября 2018

Проверка данных является критической точкой, поэтому, на мой взгляд, было бы лучше синхронизировать этот процесс.

Более того, если flatMap (this :: validateEmpId) вернет Mono.error (smth), ваши следующие валидаторы не будутне будет выполнен, поэтому вы не сможете вернуть полное сообщение об ошибке.

Автор В этой статье используется Validator в проекте webflux (реактор), поэтомуЯ считаю, что в вашем примере лучше было бы что-то вроде этого:

public Mono<Emplyoee> doValidate(Emplyoee emp){
    /*validate */
    if(valid) {
        return Mono.just(emp);
    } else {
        return Mono.error(err);
    }
}
...