Spring 响应式编程 随记 -- C2 Spring 响应式编程基本概念 (三)

本文介绍了Spring响应式编程中的异步序列生成,通过RxJava展示了如何基于时间间隔产生异步事件,并探讨了unsubscribe和isUnsubscribed在控制订阅关系中的作用。此外,还讨论了流转换的弹珠图概念,如map、filter和zip等操作符,并强调了RxJava在处理异步数据流和用户交互方面的优势,如动态取消订阅以优化服务性能。

【 好书分享:《Spring 响应式编程》-- 京东】

2.2.3 生成异步序列

RxJava 可以生产一个未来的事件,还可以基于时间间隔生产一个异步事件序列。

Observable.interval(1,TimeUnit.SECONDS)
    .subcriber(msg -> System.out.println("received: " + msg));

Thread.sleep(3000); 
// output: 
// received: 0
// received: 1
// received: 2

sleep 是为了防止主线程直接完成执行。因为生成事件和消费的过程在同一个单独的守护线程中。

当然,可以用更好的 Subscription 来控制观察者-订阅者协作的关系和操作。

interface Subscription{
    void unsubscribe();
    boolean isUnsubcribed();
}

unsubscribe 方法能让 Subscriber 通知 Observable 不需要再发送新的事件,也就是源取消订阅。
isUnsubcribed 方法则反过来,让 Observable 可以调用来检查 Subscriber 是否已经取消,用于处理是否需要发消息。

示例:订阅者一直消费数据直到收到 CountDownLatch 信号。

CountDownLatch externalSignal = ... ;

Subscription subscription = Observable.interval(100, TimeUnit.MILLISECONDS)
    .subscribe(System.out::println);

externalSignal.await();
subscription.unsubscribe();

2.2.4 流转换和弹珠图

弹珠图(marble diagram) 用于可视化的表述操作符对应的流转换。操作符可以用于调整流元素以及更改流结构。

  • map 一对一的转换
  • filter 条件过滤
  • count 返回输入流的元素数量,但只在原始流结束的时候才发出结果,所以无限流不可用。
  • zip 组合两个并行流

图片描述
更多API参考: https://rxmarbles.com/

除了框架自带的API,也完全可以根据自己的需求去实现自己需要的操作符。

只需要实现 Observable.Transformer<T,R> 派生的类即可,执行调用的时候使用 .compose(yourTransformer)

2.2.5 RxJava 的先决条件和优势

基本概念:订阅者订阅可观察流,流反过来触发时间生成的异步过程。

通过一个内存搜索引擎示例来进行对比。这个服务返回一个URL集合,用户搜索相关内容。

  • 传统API做法:
public interface SearchEngine{
    List<URL> search(String query, int limit);
}

服务执行,收集limit个结果,然后放到list里返回一个列表。实际业务中可能存在这样的场景,用户可能只需要前面的几个结果,不想等待整个结果集的完全计算结果。

  • 游标迭代器法
public interface IterableSearchEngine{
    Iterable<URL> search(String query, int limit);
}

客户端和服务端正在通过 Iterable 接口互相通信,客户端的线程在主动等待新的数据时会产生阻塞,交互效率不高。

  • CompletableFuture 构建异步服务
public interface FutureSearchEngine{
    CompletableFuture<List<URL>> search(String query, int limit);
}

没有请求阻塞,异步调用,但是调用的服务端仍然是计算整个结果集返回,要么线程唤起收到全部,要么线程异步去处理其他。

  • RxJava
public interface RxSearchEngine{
    Observable<URL> search(String query);
}

异步处理并且对每个事件做出响应,并且客户端可以根据业务情况随时取消订阅,减少搜索服务处理过程中所需要完成的工作量。

这样子,即使客户端没有收到所有的结果,它也可以处理已经到达的部分。

所以 RxJava 可以通过更加通用和灵活的方式来异步组合数据流

Spring AI Alibaba 是社区核心实现之一,期望帮助开发者更容易地构建智能体应用。它在设计理念上区别于 Spring AI 只做底层原子抽象,基于 Graph 开发者能构建工作流、多智能体应用。在设计理念上借鉴 Langgraph,可理解为 Java 版的 Langgraph 实现,社区还增加了大量预置 Node、简化了 State 定义过程等,方便开发者编写对等低代码平台的工作流、多智能体等 [^1]。 使用 Spring AI Alibaba 时,因为其基于 Spring Boot 3.x 开发,本地 JDK 版本要求为 17 及以上。以下是 Maven 依赖配置示例: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.0</version> <relativePath/> </parent> <properties> <java.version>21</java.version> </properties> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--spring-ai-alibaba--> <dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter</artifactId> <version>1.0.0-M5.1</version> </dependency> ``` 还需要配置 API 密钥: ```properties spring: ai: dashscope: api-key: your-api-key ``` 在扩展功能方面,除了 spring-ai-alibaba-core 中包含的 JsonDocumentParser 和 TextDocumentParser,spring-ai-alibaba 还提供了许多 document-parser 的扩展包,如 Markdown、pdf 等 [^2]。其内部原理遵循 RAG 运作原理,使用 spring-ai-rag 的框架 [^3]。 在使用案例上,Spring AI Alibaba Graph 可用于人类反馈相关应用,基于 Graph 开发者可以构建工作流、多智能体应用 [^1]。另外,在源码学习中,在 DeepResearchConfiguration 里,planner 节点是一个 PlannerNode 类型的节点,创建时需要传入 2 个参数,分别是 plannerAgent 和 converter [^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值