关于Java9中新的Flow
相关接口,我遇到了article。来自那里的示例代码:
public class MySubscriber<T> implements Subscriber<T> {
private Subscription subscription;
@Override
public void onSubscribe(Subscription subscription) {
this.subscription = subscription;
subscription.request(1); //a value of Long.MAX_VALUE may be considered as effectively unbounded
}
@Override
public void onNext(T item) {
System.out.println("Got : " + item);
subscription.request(1); //a value of Long.MAX_VALUE may be considered as effectively unbounded
}
如您所见,onNext()
要求推送一个新项目。
现在我想知道:
onSubscribe()
请求,请说5项request(1)
被调用,如上所述现在服务器是否应该发送
换句话说:当多次调用request()
时,这些数字会加起来吗?或先前的请求&#34;丢弃&#34;?
导致问题标题 - 订户是否需要跟踪收到的项目,以避免请求太多&#34;某些项目。
答案 0 :(得分:6)
作为Sotirios points out,request
method's Javadoc州(强调我的):
将的给定数量
n
项添加到此订阅的当前未履行需求。如果n
小于或等于零,则订阅服务器将收到带有IllegalArgumentException参数的onError信号。否则,订阅者最多可以接收n
其他onNext调用(如果已终止则会更少)。
所以答案显然是是,订阅者需要跟踪项目。事实上,这就是机制的重点。一些背景知识:request
方法旨在允许订阅者应用backpressure,通知上游组件它已经过载并且“需要中断”。因此,订户(以及仅)任务要仔细审查何时以及要请求多少新项目。在该行中,它不能“重新考虑”并降低要接收的项目数量。
降低数量也会使发布者和订阅者之间的通信“非单调”,因为完全请求的项目数量可能突然更低(因为它只能增加)。这不仅在抽象意义上令人烦恼,而且还带来了具体的一致性问题:当订阅者突然将请求的项目数量减少到1时,发布者可能正在提供一些项目 - 现在是什么?
答案 1 :(得分:3)
虽然Java 9没有实现Reactive Streams API,但它提供了几乎相同的API并定义了相应的行为。
在Reactive Streams specification中,这个加起来由以下内容定义:
对于1.1中的发布商:
发布者向订阅者发送的onNext信号总数必须小于或等于该订阅者订阅始终所请求的元素总数。
对于3.8中的订阅:
虽然订阅未被取消,但Subscription.request(long n)必须注册要生成给相应订阅者的给定数量的附加元素。
因此,Java遵循Reactive Streams API中提供的规范。