reactor使用方法_Project Reactor展开方法

reactor使用方法

最近,我的一位同事向我介绍了Project Reactor类型的expand运算符,在这篇文章中,我想介绍几种使用它的方式。

展开分页结果

考虑在名为City的模型上基于Spring Data的存储库:

 import org.springframework.data.jpa.repository.JpaRepository;  import samples.geo.domain.City;  public interface CityRepo extends JpaRepository<City, Long> {  } 

该存储库提供了一种检索分页结果的方法,大致如下:

 cityRepo.findAll(PageRequest.of( 0 , 5 )) 

现在,如果我要将多个页面展开到一个结果中,执行此操作的方法将是以下一种循环:

 var pageable: Pageable = PageRequest.of( 0 , 5 )  do { 
     var page: Page<City> = cityRepo.findAll(pageable) 
     page.content.forEach { city -> LOGGER.info( "City $city" ) } 
     pageable = page.nextPageable()  } while (page.hasNext()) 

可以使用Reactor扩展运算符通过以下方式完成分页结果的等效展开:

 val result: Flux<City> = 
     Mono 
         .fromSupplier { cityRepo.findAll(PageRequest.of( 0 , 5 )) } 
         .expand { page -> 
             if (page.hasNext()) 
                 Mono.fromSupplier { cityRepo.findAll(page.nextPageable()) } 
             else 
                 Mono.empty() 
         } 
         .flatMap { page -> Flux.fromIterable(page.content) }  result.subscribe( 
     { page -> LOGGER.info( "City ${page}" ) }, 
     { t -> t.printStackTrace() }  ) 

在这里,结果的第一页扩展到第二页,第二页扩展到第三页,依此类推,直到没有要检索的页面为止。

遍历一棵树

考虑以下模型表示的树结构中的节点:

 data class Node( 
     val id: String, 
     val nodeRefs: List<String>,  ) 

样本数据如下所示:

可以使用如下所示的调用遍历:

 val rootMono: Mono<Node> = nodeService.getNode( "1" )  val expanded: Flux<Node> = rootMono.expand { node -> 
     Flux.fromIterable(node.childRefs) 
         .flatMap { nodeRef -> nodeService.getNode(nodeRef) }  }  expanded.subscribe { node -> println(node) } 

这是广度优先的扩展,输出如下所示:

 Node- 1  Node- 1 - 1  Node- 1 - 2  Node- 1 - 1 - 1  Node- 1 - 1 - 2  Node- 1 - 2 - 1  Node- 1 - 2 - 2 

expandDeep变体将深度优先遍历

翻译自: https://www.javacodegeeks.com/2020/02/project-reactor-expand-method.html

reactor使用方法

Project Reactor 深度解析 随记 一、Project Reactor 深度解析 - 1. 响应式编程介绍,实现以及现有问题 随记: 1、响应式编程框架:RxJavaProject Reactor、Vert.x 以及 java 9 引入的响应式编程的标准接口Flow 2、什么是响应式编程 1)、传统编程存在两个问题:一个问题是:一个请求一个线程,是阻塞式调用,高并发时,如果一个IO线程阻塞的时间比较长,有可能导致线程池所有的线程都处于阻塞状态,这样就没法处理请求了。另一个问题是:一个请求要并行处理时,写代码比较麻烦。 2)、基于回调的C 阅读详情

相关推荐

React响应式编程库Project Reactor详解

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》、(架构篇)、作者、清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

JavaCodePro的博客 1086

project reactor 项目实战

项目中的rpc通过reactor-netty编写,未使用webflux自带的webClient,有以下几个原因自带的WebClient使用的是http协议,对于rpc场景冗余的信息比较多,没必要(当然它比较成熟)使用reactor-netty练练手,虽然简陋,但是收获多(主要原因…)这里先贴一下reactor-netty的官网,reactor-netty是对netty的完整reactor实践本文写的还是有些仓促,有一些点表述的不是很好,还请读者见谅,后续我再改改~

HeiheiChihiro的博客 1730

Win11 C盘瘦身终极指南:哪些能删/能移/不能碰?附详细目录清单

本文提供了一份详细的Win11 C盘瘦身终极指南,清晰区分了可安全删除、适合迁移以及绝对不能触碰的系统目录。文章不仅列出了具体的文件夹清单与操作建议,还介绍了使用符号链接和Robocopy进行安全迁移的高阶方法,并附带了自动化脚本,帮助用户从根本上解决C盘空间不足的问题,同时确保系统稳定。

weixin_29246195的博客 1487

Project Reactor 常用 API 总结

Reactor 是完全异步非阻塞的响应式编程 JVM 框架,它能通过背压的方式来实现对元素需求的管理。它提供了跟Java8 函数式接口的集成,例如 CompletableFuture, Stream 和 Duration;并主要提供两个异步序列接口Flux(N个元素) 和Mono(0-1个元素),并严格遵循响应式流的JVM规范。

龚小帅的博客 1862

Java开发】 Spring 05 :Project Reactor 响应式流框架(以Reactive方式访问Redis为例)

希望用少量、有限个数的线程来满足高负载的需要。IO阻塞浪费系统性能,只有纯异步处理才能发挥系统的全部性能。介绍一下最重要的两个类,可能单纯的介绍会让大家觉得云里雾里,但是看到后边 Redis 的实践内容就会恍然大悟了。Reactor 有两个核心类:Flux和Mono,这两个类都实现 Publisher 接口。Flux 可以触发零到多个事件,并根据实际情况结束处理或触发错误。Mono 最多只触发一个事件,所以可以把 Mono 用于在异步任务完成时发出通知。简单来说,Mono

尹煜的博客 4022

Spring Project Reactor从入门到放弃

reactor是一个基于reactive streams的响应式编程框架。在了解project reactor 项目之前, 你需要熟悉观察者模式(订阅发布模式)和reactive streams。只有了解了这些内容,才能更好的开始project reactor的学习。你可以通过看和了简单学习这两个知识点。

很多时候犯错都是在不知情的情况下发生的 1065

Project Reactor展开方法

最近,我的一位同事向我介绍了Project Reactor类型的expand运算符,在这篇文章中,我想介绍几种使用它的方式。 展开分页结果 考虑在名为City的模型上基于Spring Data的存储库: import org.springframework.data.jpa.repository.JpaRepository; import samples.geo.domain.Cit...

最佳 Java 编程 733

Project Reactor 响应式编程

前面提到的 RxJava 库是 JVM 上反应式编程的先驱,也是反应式流规范的基础。RxJava 2 在 RxJava 的基础上做了很多的更新。不过 RxJava 库也有其不足的地方。RxJava 产生于反应式流规范之前,虽然可以和反应式流的接口进行转换,但是由于底层实现的原因,使用起来并不是很直观。RxJava 2 在设计和实现时考虑到了与规范的整合,不过为了保持与 RxJava 的兼容性,很多地方在使用时也并不直观。

weixin_43866408的博客 1665

由表及里学 ProjectReactor

由表及里学 ProjectReactor http://blog.yannxia.top/2018/06/26/java/spring/projectreactor/ 用图表理解 Project Reactor

山巅 468

重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer

响应式编程是一种异步编程范式,旨在提高系统的响应能力、可伸缩性和资源利用率。它允许系统根据事件流进行编程,而不是依赖于传统的请求-响应模型。Reactor是一个用于构建非阻塞应用程序的响应式编程库。它提供了Mono和Flux两种核心数据类型,分别用于处理单个值和多个值。这些类型支持链式调用,便于对数据流进行操作和转换。HttpHandler 是 Spring WebFlux 中的核心组件之一,它提供了直接处理 HTTP 请求和响应的机制。与传统的 Servlet 模型不同,HttpHandler。

CoderJia的学习之路 1888

mongodb spring 超时时间_spring – 使用Reactive MongoDB和取消操作的流程正在取消

问题出在Project Reactor和Reactive MongoDB(Spring Data)之间.执行包含(按以下顺序)的流时:>对Reactive MongoDB进行操作的方法非常快>超过30秒的方法流被取消(查看下面的代码和日志)@GetMapping("/test/{msg}")public Mono test(@PathVariable String msg) {retu...

weixin_29163797的博客 632

Spring WebFlux 核心原理(2-2)

但是,上述定义订阅的方法是不对的。它打破了线性代码流,也容易出错。最困难的部分是需要自己管理背压并正确实现订阅者的所有 TCK 要求。在前面的示例中,打破了有关订阅验证和取消这几个 TCK 要求。建议扩展 Project Reactor 提供的 BaseSubscriber 类。

下半夜的风 1607

Neo4j Java Driver 5.19.0 异步与响应式编程实战:构建高吞吐量数据管道

本文深入探讨了Neo4j Java Driver 5.19.0的异步与响应式编程特性,指导开发者如何利用AsyncSession和ReactiveSession构建高吞吐量数据管道。通过性能优化策略、实战案例和监控方法,帮助实现高效数据处理,特别适合需要处理高并发和流式数据的应用场景。

weixin_30321449的博客 430

Spring Boot 启动指南(二)

原文:zh.annas-archive.org/md5/8803f34bb871785b4bbbecddf52d5733 译者:飞龙 协议:CC BY-NC-SA 4.0 第七章:使用 Spring MVC 创建应用程序 本章演示了如何使用 Spring MVC 创建 Spring Boot 应用程序,包括 REST 交互、消息平台和其他通信机制,并介绍了模板语言支持。尽管我在上一章中引入了服务之间的交互作为处理数据的 Spring Boot 的众多选项的一部分,但本章的主要焦点从应用程序本身转移到外部

龙哥盟 1746

Reactive编程入门:Project Reactor 深度指南

Project Reactor 是一个基于 Reactive Streams 规范的响应式编程库,为Java提供了强大的异步数据流处理能力。本节将深入探讨 Reactor 的核心组件 Flux 和 Mono,并通过丰富示例展示如何构建响应式应用。通过掌握这些核心概念和操作符,您已经具备了构建复杂响应式系统的基础能力。Reactor 的强大之处在于其丰富的操作符可以组合出几乎无限的数据处理管道,同时保持代码的声明式和简洁性。

百锦再的博客 1万+

mono map

**不改变 `Mono` 类型**:始终返回 `Mono<T>`,无法直接转换为 `Mono<R>` 以外的类型(如 `Flux`)。| `flatMap`| 异步(嵌套) | ✅ 是 | `Mono<R>`/`Flux`| 调用返回 `Mono` 的服务 |// 输出: Alice。- **同步执行**:转换操作(`Function`)会立即在当前线程执行,**不涉及异步操作**。- **`flatMap`**:用于 **异步** 操作(如调用返回 `Mono` 的服务)。

ziweixinghello的专栏 906

React编程模型:Project Reactor深度解析

在当前线程立即执行通常用于测试或不需要异步的场景使用单个可重用的线程适用于低延迟的轻量级任务所有调用者共享同一个线程无限扩展的线程池适合阻塞I/O操作每个新任务可能创建新线程有界的弹性线程池默认最多创建10 * CPU核心数的线程适合阻塞I/O操作比elastic更可控,避免资源耗尽固定大小的并行线程池默认大小等于CPU核心数适合计算密集型任务从现有的ExecutorService创建允许与现有线程池集成Mono。

百锦再的博客 1万+

响应式编程基石 Project Reactor源码解读

《深入解析Project Reactor:响应式编程的核心原理与实践》 摘要:本文深入剖析了Java响应式编程框架Project Reactor的核心实现机制。通过分析Mono和Flux的设计理念、订阅机制、操作符链、线程调度和背压控制等关键组件,揭示了响应式编程的底层原理。文章结合性能测试数据,展示了不同场景下的优化策略,并提供了API网关等实战案例。特别强调背压机制作为响应式编程的灵魂,以及常见的内存泄漏、线程阻塞等问题的解决方案。最后指出,响应式编程需要深入理解其原理才能发挥最大价值,建议开发者从简单

七夜zippoe的博客 1807

响应式编程_05 Project Reactor 框架

响应式编程_02基本概念:背压机制 Backpressure介绍了响应式流规范以及 Spring 框架中的响应式编程技术,也提到了响应式编程框架 Project ReactorReactor 是响应式领域中具有代表性的类库,实现了响应式流规范,同时已经成为 Spring 框架生态系统的重要组成部分。

小工匠 4046
上一篇: java –cp_Java –缺少字体–崩溃的应用程序!
下一篇: log4j 程序日志_Log4j错误–减慢您的应用程序
dnc8371
博客等级 码龄12年 421粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值