我遇到的问题是始终使用combineLatest运算符获得组合中的最后一个值。
我有2个热流道(a,b)以高频率生成事件(每100毫秒一个事件):
Flowable<OrderBook> flowA = sourceA.getObservableOrderBook(value);
Flowable<OrderBook> flowB = sourceB.getObservableOrderBook(value);
与combineLatest相结合,需要将近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);
}
执行组合器后,我想处理生成事件的最后一个组合,意思是(lastA,lastB)。
组合流的默认行为是将所有事件组合缓存在其自己的缓冲区中,以便组合流可以接收非常旧的组合,并且此时间隙正在爆炸。
我应该如何更改代码以禁用此缓冲区并始终接收最后一个组合?
答案 0 :(得分:5)
您可以对onBackpressureLatest
和flowA
同时使用flowB
,并使用overload of combineLatest
来指定预取金额。
Flowable.combineLatest(
Arrays.asList(flowA.onBackpressureLatest(), flowB.onBackpressureLatest()),
a -> new OrderBookCouple((OrderBook)a[0], (OrderBook)a[1]),
1
)
.onBackpressureLatest()
.observeOn(Schedulers.newThread(), false, 1)
不幸的是,没有重载同时使用BiFunction和bufferSize,因此你必须恢复为转换数组元素。
修改强>
应用第二个onBackpressureLatest
并限制observeOn
上的缓冲区大小可以让您更接近所需的模式,尽管combineLatest
并非针对此用例。您可能想要一些多样本运算符。