代码之家  ›  专栏  ›  技术社区  ›  deamon

如何将订阅者与reactor.core.publisher.Flux连接?

  •  0
  • deamon  · 技术社区  · 9 年前

    我想用反应堆通量连接用户。然而,我的小示例没有产生任何输出:

    public static void main(String[] args) throws InterruptedException {
        Flux.just("a", "b", "c")
                .subscribe(new BaseSubscriber<String>() {
                    @Override
                    protected void hookOnSubscribe(Subscription ignored) {
                    }
    
                    @Override
                    protected void hookOnNext(String value) {
                        System.out.print(value);
                    }
                });
        Thread.sleep(1000);
    }
    

    org.reactivestreams.Subscriber :

        Flux.just("a", "b", "c")
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onSubscribe(Subscription s) {
                    }
    
                    @Override
                    public void onNext(String s) {
                        System.out.println(s);
                    }
    
                    @Override
                    public void onError(Throwable t) {
                    }
    
                    @Override
                    public void onComplete() {
                    }
                });
    

    但同样,没有输出。

    Flux.just("a", "b", "c").subscribe(System.out::println);
    

    …它产生预期输出:

    a
    b
    c
    

    我如何使用订阅者从流量中接收值?

    1 回复  |  直到 9 年前
        1
  •  3
  •   deamon    9 年前

    关键是 request n源中的更多值。在那次通话之前什么都不会发生。

    示例 BaseSubscriber

    Flux<String> source = Flux.just("a", "b", "c");
    source.subscribe(new BaseSubscriber<String>() {
                @Override
                protected void hookOnSubscribe(Subscription subscription) {
                    request(1); // <-- here
                }
    
                @Override
                protected void hookOnNext(String value) {
                    request(1); // <-- here
                    System.out.println(value);
                }
            });
    

    标准也是如此 Subscriber

    Flux<String> source = Flux.just("a", "b", "c");
    source.subscribe(new Subscriber<String>() {
        private Subscription subscription;
    
        @Override
        public void onSubscribe(Subscription subscription) {
            this.subscription = subscription;
            subscription.request(1); // <-- here
        }
    
        @Override
        public void onNext(String s) {
            subscription.request(1); // <-- here
            System.out.println(s);
        }
    
        @Override
        public void onError(Throwable t) {
        }
    
        @Override
        public void onComplete() {
        }
    });