文章来源于字母哥。
https://my.oschina.net/zimug/blog/4677315
Java 9的 Reactive Streams是对异步流式编程的一种实现。它基于异步发布和订阅模型,具有非阻塞“背压”数据处理的特点。
下面是Java 响应式编程中的一些重要角色和概念,先简单理解一下
- 发布者(Publisher)是潜在的无限数量的有序数据元素的生产者。 它根据收到的需求(subscription)向当前订阅者发布一定数量的数据元素。
- 订阅者(Subscriber)从发布者那里订阅并接收数据元素。与发布者建立订阅关系后,发布者向订阅者发送订阅令牌(subscription),订阅者可以根据自己的处理能力请求发布者发布数据元素的数量。
- 订阅令牌(subscription)表示订阅者与发布者之间建立的订阅关系。 当建立订阅关系后,发布者将其传递给订阅者。 订阅者使用订阅令牌与发布者进行交互,例如请求数据元素的数量或取消订阅。
主要是继承于订阅者接口
public static interface Subscriber<T> {
public void onSubscribe(Subscription subscription);
public void onNext(T item);
public void onError(Throwable throwable);
public void onComplete();
}
- onSubscribe:在发布者接受订阅者的订阅动作之后,发布任何的订阅消息之前被调用。新创建的
Subscription
订阅令牌对象通过此方法传递给订阅者。 - onNext:下一个待处理的数据项的处理函数
- onError:在发布者或订阅遇到不可恢复的错误时调用
- onComplete:当没有订阅者调用(包括onNext()方法)发生时调用。
Publisher Interface(发布者接口)
@FunctionalInterface
public static interface Publisher<T> {
public void subscribe(Subscriber<? super T> subscriber);
}
实战案例
package com.observer;
import java.util.concurrent.Flow.Subscriber;
import java.util.concurrent.Flow.Subscription;
/**
* <p>
* 实现订阅者Subscriber Interface
* </p>
*
* @author
* @since 2020/12/1
*/
public class MySubscriber implements Subscriber<String> {
@Override
public void onSubscribe(Subscription subscription) {
System.out.println("订阅关系建立onSubscribe: " + subscription);
//能接受的消息数,这里是2条
subscription.request(2);
}
@Override
public void onNext(String item) {
System.out.println("item: " + item);
// 一个消息处理完成之后,可以继续调用subscription.request(n);向发布者要求数据发送
//subscription.request(1);
}
@Override
public void onError(Throwable throwable) {
//在发布者或订阅遇到不可恢复的错误时调用
System.out.println("onError: " + throwable);
}
@Override
public void onComplete() {
//当没有订阅者调用(包括onNext()方法)发生时调用。
System.out.println("onComplete");
}
}
package com.observer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Flow;
import java.util.concurrent.SubmissionPublisher;
/**
* <p>
* SubmissionPublisher消息发布者
* </p>
*
* @author
* @since 2020/12/1
*/
public class SubmissionPublisherExample {
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(1);
SubmissionPublisher<String> sb = new SubmissionPublisher<>(executor, Flow.defaultBufferSize());
//建立订阅关系,可以有多个订阅者
sb.subscribe(new MySubscriber());
//发送消息1
sb.submit("数据 1");
//发送消息2
sb.submit("数据 2");
//发送消息3
sb.submit("数据 3");
executor.shutdown();
}
}