拉动RxJava中的实现

时间:2018-06-12 22:55:47

标签: java rx-java2

我正在开发一个测试库,我想使用RxJava

实现一个pull实现

我有一个流(所有可用的测试),订阅了几个观察者(所有测试设备),我希望当每个订阅者完成元素请求的处理时,流的新元素,并且应该处理所有流元素只有一个消费者。

我想知道这是否可以使用热观察和使用背压技术来实现,但我不确定这一点:(

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

最后,在@akarnokd的帮助下,我找到了解决方法。这是代码:

        Subscriber sub1=new Subscriber<Integer>() {
        Subscription subscription;

        @Override
        public void onSubscribe(Subscription s) {
            this.subscription = s;
            s.request(1);
            System.out.println("onSubscribe done");
        }

        @Override
        public void onNext(Integer t) {
            System.out.println("Sub 1 Processing: "+t);
            sleep(1000);
            subscription.request(1);
        }

        @Override
        public void onError(Throwable throwable) { }

        @Override
        public void onComplete() { }
    };

    Subscriber sub2=new Subscriber<Integer>() {
        Subscription subscription;

        @Override
        public void onSubscribe(Subscription s) {
            this.subscription = s;
            s.request(1);
            System.out.println("onSubscribe done");
        }

        @Override
        public void onNext(Integer t) {
            System.out.println("Sub2 Processing: "+t);
            sleep(500);
            subscription.request(1);
        }

        @Override
        public void onError(Throwable throwable) { }

        @Override
        public void onComplete() { }
    };

    // ***** Magic happens here!! *****
    DispatchWorkProcessor<Integer> dwp = DispatchWorkProcessor.create(Schedulers.io());
    Flowable.range(1, 20).subscribe(dwp);
    dwp.subscribe(sub1);
    dwp.subscribe(sub2);
    // ********************************

    sleep(Integer.MAX_VALUE);
}

诀窍是使用request(1)来实现pull方法,并使用DispatchWorkProcessor从流中使用一次元素。尽管一个消费者的速度是预期的两倍,但是产量是预期的:

onSubscribe done
onSubscribe done
Sub 1 Processing: 1
Sub2 Processing: 2
Sub2 Processing: 3
Sub 1 Processing: 4
Sub2 Processing: 5
Sub2 Processing: 6
Sub 1 Processing: 7
Sub2 Processing: 8
Sub2 Processing: 9
Sub 1 Processing: 10
Sub2 Processing: 11
Sub2 Processing: 12
Sub 1 Processing: 13
Sub2 Processing: 14
Sub2 Processing: 15
Sub 1 Processing: 16
Sub2 Processing: 17
Sub2 Processing: 18
Sub 1 Processing: 19
Sub2 Processing: 20

所有流元素都处理一次,Sub 2处理双倍数量的元素,这很不错!