Reactor Mono应用

2024-06-22 08:20
文章标签 应用 reactor mono

本文主要是介绍Reactor Mono应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用案例

创建Mono

使用静态工厂方法创建Mono
import reactor.core.publisher.Mono;public class MonoExample {public static void main(String[] args) {// 创建一个包含值的MonoMono<String> monoWithValue = Mono.just("Hello, Reactor!");// 创建一个空的MonoMono<String> emptyMono = Mono.empty();// 创建一个包含错误的MonoMono<String> errorMono = Mono.error(new RuntimeException("Something went wrong"));}
}
从Callable、Supplier、CompletableFuture等创建Mono
import reactor.core.publisher.Mono;import java.util.concurrent.CompletableFuture;public class MonoExample {public static void main(String[] args) {// 从Callable创建MonoMono<String> callableMono = Mono.fromCallable(() -> "Hello from Callable");// 从Supplier创建MonoMono<String> supplierMono = Mono.fromSupplier(() -> "Hello from Supplier");// 从CompletableFuture创建MonoCompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello from CompletableFuture");Mono<String> futureMono = Mono.fromFuture(future);}
}

订阅Mono

订阅是开始数据流处理的关键步骤

import reactor.core.publisher.Mono;public class MonoExample {public static void main(String[] args) {Mono<String> mono = Mono.just("Hello, Reactor!");// 订阅并消费数据mono.subscribe(value -> System.out.println("Received: " + value), // onNexterror -> System.err.println("Error: " + error),   // onError() -> System.out.println("Completed")             // onComplete);}
}

操作Mono

转换和操作数据
import reactor.core.publisher.Mono;public class MonoExample {public static void main(String[] args) {Mono<String> mono = Mono.just("hello");// 转换数据Mono<String> transformedMono = mono.map(String::toUpperCase);// 链式操作transformedMono.flatMap(value -> Mono.just(value + " World")).subscribe(System.out::println);  // 输出: HELLO World}
}

异常处理

import reactor.core.publisher.Mono;public class MonoExample {public static void main(String[] args) {Mono<String> monoWithError = Mono.error(new RuntimeException("Original Error"));// 捕获并处理错误monoWithError.onErrorReturn("Fallback value").subscribe(System.out::println);  // 输出: Fallback value// 使用 onErrorResume 提供备用的 MonomonoWithError.onErrorResume(error -> {System.err.println("Error: " + error);return Mono.just("Recovered value");}).subscribe(System.out::println);  // 输出: Recovered value}
}

组合Mono

import reactor.core.publisher.Mono;public class MonoExample {public static void main(String[] args) {Mono<String> mono1 = Mono.just("Hello");Mono<String> mono2 = Mono.just("World");// 组合两个MonoMono<String> combinedMono = Mono.zip(mono1, mono2, (s1, s2) -> s1 + " " + s2);combinedMono.subscribe(System.out::println);  // 输出: Hello World}
}

调试和日志

使用日志功能可以帮助调试和监控数据流。

import reactor.core.publisher.Mono;
import reactor.util.Logger;
import reactor.util.Loggers;public class MonoExample {public static void main(String[] args) {Logger logger = Loggers.getLogger(MonoExample.class);Mono<String> mono = Mono.just("Hello, Reactor!").log();  // 默认日志mono.subscribe(System.out::println);}
}

调度器(Schedulers)

使用调度器来控制Mono的执行线程。

import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;public class MonoExample {public static void main(String[] args) {Mono<String> mono = Mono.fromCallable(() -> {// 在独立的线程池中执行Thread.sleep(1000);return "Hello from another thread";});mono.subscribeOn(Schedulers.boundedElastic())  // 指定订阅时的调度器.publishOn(Schedulers.parallel())         // 指定发布时的调度器.subscribe(System.out::println);}
}

应用场景

异步计算

Mono可以用来表示和处理异步计算的结果。例如,当你需要从一个异步操作中获取一个值时,可以使用Mono。

Mono<String> asyncResult = Mono.fromCallable(() -> {// 模拟异步计算Thread.sleep(1000);return "Result";
});asyncResult.subscribe(result -> System.out.println("Received: " + result));

调用远程服务

在微服务架构中,调用远程服务(如REST API或gRPC)时,通常会返回一个单一的结果。这是Mono的一个典型应用场景。

WebClient webClient = WebClient.create("http://example.com");Mono<String> response = webClient.get().uri("/resource").retrieve().bodyToMono(String.class);response.subscribe(body -> System.out.println("Response: " + body));

数据库查询

Mono非常适合表示数据库查询返回的单个结果。例如,查询一个用户的信息

Mono<User> userMono = reactiveUserRepository.findById(userId);userMono.subscribe(user -> System.out.println("User: " + user));

事件驱动的处理

在事件驱动架构中,某些事件处理结果可能是单一的值。例如,处理某个事件并返回一个处理结果

Mono<EventResult> eventResultMono = processEvent(event);eventResultMono.subscribe(result -> System.out.println("Event processed: " + result));

错误处理

使用Mono可以优雅地处理异步操作中的错误。例如,如果某个操作可能会失败,可以返回一个错误的Mono并在订阅时处理错误

Mono<String> result = performOperation().onErrorReturn("Fallback value");result.subscribe(value -> System.out.println("Received: " + value),error -> System.err.println("Error: " + error)
);

延迟操作

Mono可以用于表示一个延迟操作,执行某些延迟逻辑

Mono<Long> delayMono = Mono.delay(Duration.ofSeconds(3));delayMono.subscribe(time -> System.out.println("Delayed for 3 seconds"));

条件逻辑

使用Mono可以在异步流中进行条件判断和逻辑处理。例如,根据某个条件返回不同的结果

Mono<String> conditionalMono = Mono.just("data").flatMap(data -> {if (data.equals("condition")) {return Mono.just("Condition met");} else {return Mono.just("Condition not met");}});conditionalMono.subscribe(System.out::println);

转换与映射

Mono可以用于对单个值进行转换或映射。例如,将一个值转换为另一个类型的值

Mono<String> originalMono = Mono.just("original");Mono<Integer> transformedMono = originalMono.map(String::length);transformedMono.subscribe(length -> System.out.println("Length: " + length));

资源管理

Mono可以用于在异步操作中管理资源,如文件或连接的打开和关闭

Mono.using(() -> new BufferedReader(new FileReader("data.txt")), reader -> Mono.fromCallable(() -> reader.readLine()), BufferedReader::close
).subscribe(line -> System.out.println("Read line: " + line));

组合多个异步操作

Mono可以用于组合多个异步操作,构建复杂的异步数据流

Mono<String> combinedMono = Mono.zip(Mono.just("Hello"),Mono.just("World"),(s1, s2) -> s1 + " " + s2
);combinedMono.subscribe(System.out::println);  // 输出: Hello World

这篇关于Reactor Mono应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083753

相关文章

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用。如果你看不懂,请留言。 完整代码: <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><ti

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍: 一、气象站的种类 根据用途和安装环境分类: 农业气象站:专为农业生产服务,监测土壤温度、湿度等参数,为农业生产提供科学依据。交通气象站:用于公路、铁路、机场等交通场所的气象监测,提供实时气象数据以支持交通运营和调度。林业气象站:监测林区风速、湿度、温度等气象要素,为林区保护和

PyTorch模型_trace实战:深入理解与应用

pytorch使用trace模型 1、使用trace生成torchscript模型2、使用trace的模型预测 1、使用trace生成torchscript模型 def save_trace(model, input, save_path):traced_script_model = torch.jit.trace(model, input)<

哺乳细胞重组表达人鼠嵌合抗体:制备与应用

重组抗体是一类具有广泛应用价值的蛋白质,在药物研发和生物医学研究中发挥着重要作用。本文将介绍重组抗体的表达方式,重点关注嵌合抗体制备和哺乳细胞重组表达人鼠嵌合抗体的技术原理和应用。 重组抗体表达的原理和方法 重组抗体表达是通过将人或动物源的免疫球蛋白基因导入表达宿主细胞,并使其表达出特异性抗体蛋白质。常用的表达系统包括细菌、哺乳细胞和真核微生物等。 嵌合抗体制备的步骤和优势 选择适当的抗原

【Qt6.3 基础教程 16】 掌握Qt中的时间和日期:QTimer和QDateTime的高效应用

文章目录 前言QTimer:定时任务的强大工具QTimer的基本用法高级特性:单次定时器 QDateTime:处理日期和时间获取当前日期和时间日期和时间的格式化输出日期和时间计算 用例:创建一个倒计时应用结论 前言 在开发桌面应用程序时,处理时间和日期是一个常见且重要的任务。Qt框架提供了强大的工具来处理与时间相关的功能,其中QTimer和QDateTime是最核心的类。本

基于Spring Boot的企业级应用架构设计

基于Spring Boot的企业级应用架构设计 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我想和大家分享一下基于Spring Boot的企业级应用架构设计,希望对大家有所帮助。 一、Spring Boot概述 Spring Boot是由Pivotal团队提供的全新框架,它简化了Spring应用程序的创建和开发过程。

LoRaWAN在嵌入式网络通信中的应用:打造高效远程监控系统(附代码示例)

引言 随着物联网(IoT)技术的发展,远程监控系统在各个领域的应用越来越广泛。LoRaWAN(Long Range Wide Area Network)作为一种低功耗广域网通信协议,因其长距离传输、低功耗和高可靠性等特点,成为实现远程监控的理想选择。本文将详细介绍LoRaWAN的基本原理、应用场景,并通过一个具体的项目展示如何使用LoRaWAN实现远程监控系统。希望通过图文并茂的讲解,帮助读

一二三应用开发平台应用开发示例(4)——视图类型介绍以及新增、修改、查看视图配置

调整上级属性类型 前面为了快速展示平台的低代码配置功能,将实体文件夹的数据模型上级属性的数据类型暂时配置为文本类型,现在我们调整下,将其数据类型调整为实体,如下图所示: 数据类型需要选择实体,并在实体选择框中选择自身“文件夹” 这时候,再点击生成代码,平台会报错,提示“实体【文件夹】未设置主参照视图”。这是因为文件夹选择的功能页面,同样是基于配置产生的,因为视图我们还没有配置,所以会报错。