Java 禁用可流动/可观察缓冲区

Java 禁用可流动/可观察缓冲区,java,java-8,rx-java,reactive-programming,rx-java2,Java,Java 8,Rx Java,Reactive Programming,Rx Java2,我始终无法从CombineTest运算符获得的组合中获取最后一个值 我有2个热流体(a、b),以高频产生事件(每100毫秒一次事件): Flowable flowA=sourceA.getobserveOrderbook(值); 可流动flowB=sourceB.getObservableOrderBook(值); 与CombineTest相结合,这需要300毫秒才能完成它的工作 Flowable<OrderBookCouple> combined = Flowable.combi

我始终无法从CombineTest运算符获得的组合中获取最后一个值

我有2个热流体(a、b),以高频产生事件(每100毫秒一次事件):

Flowable flowA=sourceA.getobserveOrderbook(值);
可流动flowB=sourceB.getObservableOrderBook(值);
与CombineTest相结合,这需要300毫秒才能完成它的工作

Flowable<OrderBookCouple> combined = Flowable.combineLatest(flowA, flowB,        OrderBookCouple::new).observeOn(Schedulers.newThread());
combined.subscribe((bookCouple) -> {
                System.out.println("A timestamp: " + bookCouple.aOrderBook.getTimeStamp());
                System.out.println("B timestamp: " + bookCouple.bOrderBook.getTimeStamp());
                Thread.sleep(300);
            }
Flowable combined=Flowable.combineTest(flowA、flowB、OrderBookCourt::new).observeOn(Schedulers.newThread());
合并。订阅((书对)->{
System.out.println(“时间戳:+bookCouple.aOrderBook.getTimeStamp());
System.out.println(“B timestamp:+bookCouple.bOrderBook.getTimeStamp());
睡眠(300);
}
执行一次组合器后,我想处理生成的事件的最后一次组合,即(lastA,lastB)

组合流的默认行为是将所有事件组合缓存在其自己的缓冲区中,以便组合流接收非常旧的组合,并且此时间间隔正在爆炸


如何更改代码以禁用此缓冲区并始终接收最后一个组合?

您可以对
flowA
flowB
应用
OnBackPressureRelatest
,并使用指定预取量的

Flowable.combineLatest(
    Arrays.asList(flowA.onBackpressureLatest(), flowB.onBackpressureLatest()),
    a -> new OrderBookCouple((OrderBook)a[0], (OrderBook)a[1]),
    1
)
.onBackpressureLatest()
.observeOn(Schedulers.newThread(), false, 1)
不幸的是,没有同时使用双函数和缓冲大小的重载,因此您必须恢复到强制转换数组元素

编辑


应用第二个
onBackpressureLatest
并限制
observeOn
上的缓冲区大小应该会使您更接近所需的模式,尽管
combinelateest
并非针对此用例。您可能需要一些多示例运算符。

我在这里用一个简化的示例尝试了您的解决方案,似乎这里仍然是缓冲区。代码在这里可用:更新了我的答案。这是有效的,我相应地更新了要点。谢谢。
Flowable.combineLatest(
    Arrays.asList(flowA.onBackpressureLatest(), flowB.onBackpressureLatest()),
    a -> new OrderBookCouple((OrderBook)a[0], (OrderBook)a[1]),
    1
)
.onBackpressureLatest()
.observeOn(Schedulers.newThread(), false, 1)