当前位置: 首页 > 知识库问答 >
问题:

是否最好在Mono的单个管道中多次使用平面图?

呼延才
2023-03-14

作为开发团队的一部分,我们希望构建一个非阻塞应用程序,因为我们正在使用SpringReactor 3构建我们的应用程序。因此,在使用project reactor时,我有一系列问题:

>

  • 在单个管道和单声道上使用多个平面地图是一个好的做法吗

    @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)
    }
    
    }
    

    与map相比,flatMap的资源成本是否更高?


  • 共有2个答案

    鄢英哲
    2023-03-14

    数据的验证是关键点,所以在我看来,最好同步这个过程。

    此外,如果flatMap(this::validateEmpId)将返回Mono。错误(smth)您的下一个验证器将无法执行,因此您将无法返回完整的错误消息。

    本文作者在webflux(reactor)项目中使用了验证器,所以我相信在您的示例中,更好的方法是这样的:

    public Mono<Emplyoee> doValidate(Emplyoee emp){
        /*validate */
        if(valid) {
            return Mono.just(emp);
        } else {
            return Mono.error(err);
        }
    }
    
    盛建德
    2023-03-14

    我认为您应该尝试简化验证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)。

     类似资料:
    • 问题内容: 我是使用准备好的语句从数据库查询数据的新手,并且在实现c#的参数(特别是OracleParameters)时遇到问题。 因此,假设我有以下SQL: 代码是这样的: 问题是执行cmd时,t1.columnX获得strParm的值,但是当t2.columnY即将获得strParm的值时,它将引发“ ORA-01008:并非所有变量都绑定”异常。 在我看来,即使该参数在sql中的其他位置看到

    • 我正在使用Jedis,我想创建一个包含多个独立事务(multi/exec块)的管道。 从我到目前为止看到的情况来看,似乎只有将整个管道切换成原子事务才是可能的。 我希望返回一个。 我怀疑在一个事务中使用整个流水线要比在一个流水线中使用多个较小的事务块花费更多。 谢谢!

    • 问题内容: 我想使用React在整个DOM中多次添加组件。这个小提琴显示了我要执行的操作,并且不会引发任何错误。这是代码: HTML: JS: 我已经看过这个问题了,恐怕通过上述操作,我将冒使React组件相互干扰的风险。该问题的答案建议使用服务器端渲染,这对我来说不是一个选择,因为我正在使用Django服务器端。 另一方面,也许我在做什么就可以了,因为我只安装了一个React库实例(而不是多个组

    • 我的要求是将数据发送到不同的ES接收器(基于数据)。例如:如果数据包含特定信息,则将其发送到sink1,否则将其发送到sink2等(基本上是根据数据动态发送到任何一个接收器)。我还想分别为ES sink1、ES sink2、ES sink3等设置并行度。 有什么简单的方法可以在flink中实现上述目标吗? 我的解决方案:(但并不满意) 我可以想出一个解决方案,但有中间Kafka主题,我写(topi

    • 在模板中使用自定义管道时,如下所示: 而且效果很好。 但它表明 用户名未定义

    • 问题内容: 我只是从.net开发转到LINUX MONO开发…,而我之前没有Linux开发方面的丰富经验。 我需要在mono c#中创建后台服务(例如Windows服务)。 并且可以从mono c#访问LINUX本机API。(例如从win c#调用winAPI)。 问题答案: Mono带有与Windows Service兼容的系统,称为Mono-service。 Unix中用于服务的单词是Daem