如何在Project Reactor中为每个订户使用专用缓冲区?

时间:2018-04-26 05:27:33

标签: java project-reactor

我正在尝试使用Project Reactor创建一个示例项目,并尝试以下方案:

  • 基于热源的发布商,每秒生成一个项目。
  • 两个订阅者(在不同的线程上):一个能够保持热观察的速度,另一个慢速,需要缓冲元素。
  • 每个订户的专用且可配置的大小缓冲区。一旦缓冲区已满,元素就会被删除。

在Java 9中,this is possible使用类SubmissionPublisher

  

“缓冲允许生产者和消费者在短时间内进行操作   不同的费率。每个订户使用独立的缓冲区。缓冲区   在第一次使用时创建并根据需要扩展到给定的   最大“。

我的例子基于这个示例代码,我试图应用上述条件:

import java.time.Duration;

import reactor.core.publisher.ConnectableFlux;
import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;

public class FluxTest {

  public static void main(String[] args) {
    final ConnectableFlux<Integer> publisher = Flux.range(1, 20)
      .delayElements(Duration.ofSeconds(1))
      .replay(8);

    publisher.publishOn(Schedulers.newSingle("fast"))
      .subscribe(i -> {
        System.out.println("Fast subscriber - Received " + i);
        sleep(1);
      });

    publisher.publishOn(Schedulers.newSingle("slow"))
      .subscribe(i -> {
        System.out.println("Slow subscriber - Received " + i);
        sleep(5);
      });

    publisher.connect();
  }

  private static void sleep(int seconds) {
    try {
      Thread.sleep(seconds * 1000L);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
}

这无法实现目标,因为无论如何都要缓冲项目。缓冲区的大小仅在下一个订阅者订阅之前应用。

如何使用Project Reactor的Flux获得每个订阅者的独立缓冲和丢弃?

注1:我问了一个相关问题here,但在这种情况下,问题只涉及一种方法。

注2:如果你很好奇,我正在尝试在Project Reactor中编写this example代码,但我正在努力解决它。

0 个答案:

没有答案