流程编程:订阅者和发布者跟踪计数?

时间:2017-07-19 14:31:13

标签: java reactive-programming java-9

关于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)被调用,如上所述

现在服务器是否应该发送

  • 五项(要求5项。发送-1次。要求+1次)
  • 或一个项目(因为先前的请求得到&#34;被新的请求丢弃&#34;

换句话说:当多次调用request()时,这些数字会加起来吗?或先前的请求&#34;丢弃&#34;?

导致问题标题 - 订户是否需要跟踪收到的项目,以避免请求太多&#34;某些项目。

2 个答案:

答案 0 :(得分:6)

作为Sotirios points outrequest 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中提供的规范。