Rx-java 2:如何设置可观察对象之间的优先级?

时间:2019-02-11 13:10:55

标签: java rx-java rx-java2

我有一个基于时间的算法,在某些情况下,来自不同观测值的两个发射可能在同一时刻发生。

请参见下面的代码:

   int moment = ...; //calculated
   Observable.timer(moment, unit)
    .takeUntil(messages) 
    .map(e -> new Action())

messages的观察值在Schedulers.computation()上执行,就像计时器一样。

当消息与计时器同时出现时,该行为是随机的。有时会发出新的Action,有时则不会,takeUntil(messages)优先。

我需要对此行为进行完全控制。当然,我可以向moment添加几毫秒,就像这样,它将总是在messages之后执行,但这不是我想要的。

如何告诉RxJava messages比计时器优先?

更新

为澄清这个问题,我添加了此测试,该测试每次执行都会成功

    //before launching the test
    RxJavaPlugins.setComputationSchedulerHandler(scheduler ->
                        new TestScheduler());


    @Test
    public void rx_precedence() {

        int moment = 5;
        Observable<Long> messages = Observable.timer(moment, TimeUnit.SECONDS);
        TestObserver<Long> testObserver = Observable.timer(moment, TimeUnit.SECONDS)
                .takeUntil(messages)
                .test();

        scheduler.advanceTimeTo(moment, TimeUnit.SECONDS);
        testObserver.assertNoValues();
        testObserver.assertTerminated();
    }

在相同的moment上,执行takeUntil并且不发出任何值。

但是在服务器上,在现实世界中,当je JVM同时执行多项操作时,timer可能优先于takeUntil

我需要一种使该优先级在任何环境下都稳定的方法,以便在messages同时用完timer发出值时不会发出任何值。

1 个答案:

答案 0 :(得分:0)

您猜到Observable.amb()http://reactivex.io/documentation/operators/amb.html

更新: 好的,问题现在更加清楚了。也许Scheduler.single()会有所帮助。