Rx java Rx缓冲具有限制的快速生成流+;超时

Rx java Rx缓冲具有限制的快速生成流+;超时,rx-java,Rx Java,我试图通过在适当的时候执行批处理请求来优化RxJava的web服务调用,但不会给响应带来太多延迟。 为此,我使用带有debounce()的buffer(closingSelector)操作符作为关闭选择器,如下所示: Observable-burstyMulticast=requestStream.share(); 可观测burstyDeBounced=burstyMulticast.debounce(窗口大小,窗口单位); burstyMulticast.buffer(burstyDeBoun

我试图通过在适当的时候执行批处理请求来优化RxJava的web服务调用,但不会给响应带来太多延迟。 为此,我使用带有
debounce()
buffer(closingSelector)
操作符作为关闭选择器,如下所示:

Observable-burstyMulticast=requestStream.share();
可观测burstyDeBounced=burstyMulticast.debounce(窗口大小,窗口单位);
burstyMulticast.buffer(burstyDeBounced).subscribe(/*使用批处理调用外部WS*/);
它工作得很好,除了如果
requestStream
产生的速度太快,它会发出大量的批处理,对于WS来说,这些批处理太大了,所以我想以某种方式限制批处理的大小。 因此,我需要一个
closingSelector
,如果缓冲区中有X个项目,或者自上一个项目从上游到达后经过了Y个时间量,则该选择器将发出关闭事件

除了实现一个自定义的
操作符
之外,我似乎找不到一个好的解决方案,该操作符类似于
操作符debouncewithtime
,但使用一个内部缓冲区,返回缓冲区中的所有元素,而不是最后一个元素

是否有一种更简单的方法来实现这一点,例如结合一些行动计划

编辑:


在发布了这个问题之后,我意识到上面的代码段还有另一个问题:如果请求流的速度持续快于解盎司超时(
requestStream
产生的速度快于
windowSize
)然后,
burstyDeBounced
将不会发出任何消息,因此所有请求都将被缓冲,直到传入流中有足够长的暂停时间。

您可以将去公告源的大缓冲区拆分为较小的缓冲区:

Observable<BaseCall<T, R>> burstyMulticast = requestStream.share();
Observable<BaseCall<T, R>> burstyDeBounced = burstyMulticast
    .debounce(windowSize, windowUnit);

burstyMulticast.buffer(burstyDeBounced)
.onBackpressureBuffer()
.concatMapIterable(list -> Lists.partition(list, windowSizeLimit))
.subscribe(...);
Observable-burstyMulticast=requestStream.share();
可观测的burstyDeBounced=burstyDeBounced
.debounce(窗口大小,窗口单位);
burstyMulticast.buffer(burstyDeBounced)
.onBackpressureBuffer()
.concatMapIterable(列表->列表.partition(列表,windowSizeLimit))
.认购(……);

谷歌番石榴在哪里

您可以将去抖动震源的大缓冲区拆分为较小的缓冲区:

Observable<BaseCall<T, R>> burstyMulticast = requestStream.share();
Observable<BaseCall<T, R>> burstyDeBounced = burstyMulticast
    .debounce(windowSize, windowUnit);

burstyMulticast.buffer(burstyDeBounced)
.onBackpressureBuffer()
.concatMapIterable(list -> Lists.partition(list, windowSizeLimit))
.subscribe(...);
Observable-burstyMulticast=requestStream.share();
可观测的burstyDeBounced=burstyDeBounced
.debounce(窗口大小,窗口单位);
burstyMulticast.buffer(burstyDeBounced)
.onBackpressureBuffer()
.concatMapIterable(列表->列表.partition(列表,windowSizeLimit))
.认购(……);

谷歌番石榴在哪里

我最终实现了一个定制op:它似乎工作得很好。我很乐意接受改进建议。

我最终实现了一个定制操作:它似乎工作得很好。我很乐意听取改进建议。

谢谢您的意见,不幸的是,我意识到上面的原始代码段存在另一个问题,因此我无法使用debounce,请参阅我在原始帖子中的编辑。感谢您的意见,不幸的是,我意识到上面的原始代码段存在另一个问题,所以我不能使用debounce,请查看我在原始帖子中的编辑。你最终找到了解决这个问题的好方法吗?如果是的话,你能把它寄出去吗?干杯最后你能找到解决这个问题的好办法吗?如果是的话,你能把它寄出去吗?干杯