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

RxJava实战:响应式编程入门与数据流操作
本文介绍了如何在Java中使用RxJava响应式编程框架,包括响应式流的概念、Observable和Subscriber的交互,以及生产和消费流数据的方法。通过实例演示了如何创建Observable并订阅,展示了流的灵活运用和错误处理机制。


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

2.2 使用 RxJava 响应式框架的实践

RxJava 库 是 Reactive Extensions 的 Java虚拟机实现,近似于观察者模式,迭代器模式,函数式编程的组合。

2.2.1 响应式流 = 观察者 + 迭代器

通过事件分离生产者和消费者。

迭代器模式:不希望生产者在消费者出现之前生产数据的场景。

public interface Iterator<T> {
    T next();
    boolean hasNext();
}

// 结合观察者
public interface RxObserver<T> {
    void onNext(T next); // 通知新值
    void onComplete(); // 通知结束
    void onError(Exception e); // 通知出错
}

RxObserver 类似于前面介绍的观察者模式中的 Observer。

对于订阅的内容和订阅者,我们可以定义 Observale 和 Subcriber

  • Observable : 类似于观察者模式中的Subject,可观察的事件源,他会发出元素,并且有流转化方法和流初始化工厂方法。
  • Subscriber :抽象类,用于实现 Observer 观察者的接口,并且消费元素,实现类的基础

同时,我们定义 Subcription 来控制 Observable 和 Subscriber 之间的运行时关系。Subscription 可以检查订阅状态,并且在必要的时候取消订阅。

生产者和消费者之间的Subcription契约如下:

---------| — onNext —> | -----------
| Observable | – onComplete -> | Observer |
--------- | — onError —> |------------

根据RxJava中的规则,Observable 事件源可以发送0-N个元素,通过声明成功和引发错误来指示结束。

所以 Observable 事件源会对相关联的 Subscriber 多次调用 onNext,最后调用 onComplete 或 onError。

2.2.2 生产和消费流数据

把 Observable 视为一个事件生成器,在订阅时会给订阅者传播事件。

Observable<String> observable = Obervable.create(
	new Observable.OnSubcribe<String>(){
    	@Override
        public void call(Subcriber<? super String> sub){
        	sub.onNext("Hello, reactive world!");
            sub.onCompleted();
        }
    }
);

// 当订阅者出现时立刻会触发 call()
// lambda写法
Observable<String> observable = Obervable.create(
    sub -> {
        sub.onNext("Hello, reactive world!");
        sub.onCompleted();
    }
);

Observable 是可重用的,每个订阅者在订阅之后就会立刻收到这个消息事件。RxJava 1.2.7开始,Observable的创建因为不安全被弃用,因为它可能生成太多元素导致订阅者负载过多。即这种方法不支持背压。

对应的订阅者代码如下:

Subcriber<String> subscriber = new Subcriber<String>(){
	@Override
    public void onNext(String s){
    	System.out.println("receive: " + s);
    }

    @Override
    public void onCompleted(){
        System.out.println("Done.");
    }

    @Override
    public void onError(Throwable e){
        System.err.println(e);
    }
}

所以现在订阅者 Subcriber 和 消息源 Observable 可以一起工作了。Subcriber 必须要实现Observer观察者的方法,定义 onNext 来响应新事件,定义 onCompleted 来响应流完成,定义 onError 来响应错误。

最后只要在 Observable 添加订阅关系即可完成这个响应式demo程序。

observable.subscribe(subcriber);
// output:
// receive: Hello, reactive world!
// Done.

// 更简化的lambda写法
Observable<String> observable = Obervable.create(
    sub -> {
        sub.onNext("Hello, reactive world!");
        sub.onCompleted();
    }
);

observable.subscribe(
    s -> System.out.println("receive: " + s),
    () -> System.out.println("Done"),
    System.err::println;

);
// output:
// receive: Hello, reactive world!
// Done.

Rxjava 库对于创建消息源 Observable 实例很灵活。

Observable.just("1","2","3","4");
Observable.from(new String[]{"A", "B", "C", "D"});
Observable.from(Collections.emptyList());

Observale<String> msg1 = Observable.fromCallable(()->"hello-");
Future<String> future = Executors.newCachedThreadPool().submit(() -> "world");
Observale<String> msg2 = Observable.from(future); 

//组合多个流 处理顺序按照参数顺序
Observale<String> msg = Observable.concat(msg1, msg2, Observable.just("."));
msg.forEach(System.out::print);
// output: hello-world.

虽然有onError信号来处理出错,看起来不用去为异常定义处理程序,但是在发生错误的时候,默认的 Subscriber 实现仍然会抛出一个 rx.exceptions.OnErrorNotImplementedException

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、付费专栏及课程。

余额充值