资讯专栏INFORMATION COLUMN

处理Empty Mono的方法

qpwoeiru96 / 1018人阅读

摘要:在编程中有时候我们需要对做一些特定业务逻辑。诸如的绝大部分都依赖于和都是推送数据详情请看,如果本身无数据可推送,那么就不会触发。换句话说内部是不可能得到的。那么怎么做才可以你可以使用的来作为中间值除了之外,还提供了来处理。

在Reactor编程中有时候我们需要对empty Mono做一些特定业务逻辑。下面看一段非reactor编程的代码:

public void oldCheck(Token token) {
  if (token == null) {
    // business logic
    return;
  }
  if (token.isExpired) {
    // business logic
    return;
  }
  // business logic
  return;
}

如果让你改成reactor你也许会改成这样:

public Mono badCheck(Mono tokenMono) {
  return tokenMono
      .flatMap(token -> {
        if (token == null) {
          // CAUTION: You will never be in here
          // business logic
          return Mono.empty();
        }
        if (token.isExpired) {
          // business logic
          return Mono.empty();
        }
        // business logic
        return Mono.empty();
      });
}

上面的示例代码里的注释已经写了if (token == null) {}的这个条件是永远成立的,这是因为当Mono是empty时,它是不会触发flatMap的。诸如flatMap的绝大部分Operator都依赖于PublisherMonoFlux都是Pubisher)推送数据(详情请看javadoc),如果Publisher本身无数据可推送,那么就不会触发Operator。换句话说flatMap内部是不可能得到null的。

那么怎么做才可以?你可以使用Java 8的Optional来作为中间值:

public Mono goodCheck(Mono tokenMono) {
  return tokenMono
      // Transform Mono to Mono>.
      // If Mono is empty, flatMap will not be triggered,
      // then we will get a empty Mono>
      .flatMap(token -> Mono.just(Optional.of(token)))
      // If Mono> is empty, provide an empty Optional,
      // then we will get a non-empty Mono> anyway
      .defaultIfEmpty(Optional.empty())
      // Since Mono> is not empty, flatMap will always be triggered.
      .flatMap(tokenOptional -> {
        if (!tokenOptional.isPresent()) {
          // business logic
          return Mono.empty();
        }
        Token token = tokenOptional.get();
        if (token.isExpired) {
          // business logic
          return Mono.empty();
        }
        // business logic
        return Mono.empty();
      });
}

除了defaultIfEmpty之外,Reactor还提供了switchIfEmptyrepeatWhenEmpty来处理empty Mono/Flux

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74186.html

相关文章

  • SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本

    摘要:添加相关依赖之后,会有这个。接着,根据的源码分析,会继续链路,到达下一个,即。在中,我们会计算出路由并发送请求到符合条件的。这个是的,会读取配置并生成路由。本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent我们继续分析上一节提到的 WebHandler。加入 Spring Cloud Sleuth 以及 Prometheus 相关依赖...

    不知名网友 评论0 收藏0
  • SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本

    摘要:升级之路版基本流程讲解抽象类本系列代码地址我们继续分析上一节提到的。添加相关依赖之后,会有这个。路由权重相关配置功能相关实现类,这个我们这里不关心。这个是的,会读取配置并生成路由。 本系列代码地址:​​https://github.com/JoJoTec/spring-cloud-parent​​我们继续分析上一节提到的 ...

    番茄西红柿 评论0 收藏2637
  • spring cloud gateway 源码解析(1)整体流程

    摘要:公司要做自己的网关,于是先把的过了一遍,然后把源码在看了一遍,这样公司的需求就搞定了。包括动态路由,多纬度限流,记录请求参数及返回参数也可修改。至此,流程就走完了。 公司要做自己的网关,于是先把github的issue过了一遍,然后把gateway源码在看了一遍,这样公司的需求就搞定了。包括动态路由,多纬度限流,记录请求参数及返回参数(也可修改)。先从请求进入网关说起吧: 请求先进...

    miqt 评论0 收藏0
  • Spring Security: Webflux 默认配置

    摘要:默认配置所谓默认配置就是对不做任何配置让它的自动配置起作用目的是对的默认行为有一个初步的直观的了解第一步使用的创建项目项目创建完成会自动生成一个应用入口类第二步创建一个控制器启动会在控制台输出中看到一个水机生成的格式的密码最后打开即可显示 默认配置 所谓默认配置, 就是对Spring Security不做任何配置. 让它的自动配置起作用. 目的是对Spring Security 的默认...

    luoyibu 评论0 收藏0
  • springboot(六)——springboot与webflux结合初探

    摘要:的这几天看了看的请求处理流程,因为之前一直用的和,一开始对的处理流程有点懵逼,找不到入口,后来跟了代码,在网上找了点资料,发现的入口在的方法该方法的作用就是把接收到的或者最终需要返回的,包装转换为和。 spring-cloud-gateway 的ReactorHttpHandlerAdapter 这几天看了看spring-cloud-gateway的请求处理流程,因为之前一直用的spr...

    hersion 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<