如何在RxJava中将AbstractOnSubscribe转换为具有背压支持的运算符?

时间:2015-09-15 10:10:30

标签: java rx-java

我扩展了AbstractOnSubscribe以创建我自己的OnSubscribe,以便与我Observable.create(OnSubscribe<T>) InputStream一起使用,该onNext基本上读取InputStream并调用{{1}对于每一行。

问题是,我还需要将Observable作为其他Observable<InputStream> isObservable = ...; isObservable .flatMap(is -> Observable.create(new OnSubscribeInputStreamToLines(is))); 的一部分。

简单的解决方案是执行以下操作:

Observable.lift

事情是,它不会真正有效,因为它会为每个inputStream创建一个Observable。我以为我可以使用OnSubscribeInputStreamToLines来完成此任务。

有没有办法可以轻松将Operator转换为onNext

我主要担心背压问题,因为我会为InputStream的每一行拨打AbstractOnSubscribe,虽然AbstractOperator支持背压,但我找不到{{1}这也是一样的。

由于

2 个答案:

答案 0 :(得分:1)

这里的区别在于,OnSubscribeInputStreamToLines是进入Observable世界的入口点,而lift是现有序列的中间运算符。此外,整个吞吐量可能由InputStream后面的IO操作或操作中的字符串处理所主导,所以我不会担心这个瘦包装器。

AbstractOnSubscribe捕获运算符的生成器方面,帮助您构建背压感知值发射器(通常是冷源),您可以在其中草拟出发射的方式,时间和值。

另一方面,

AbstractOperator不能以这种方式推广,因为Operator有更多的自由来与上游值和下游请求进行交互。它们针对特定任务进行了高度定制,并且对它们几乎没有共同点。它们可以用一组原语构建,但就是这样(我写了数百个)。

所以不要害怕flatMap ping事情。

答案 1 :(得分:1)

不要为每个lift创建另一个Observable而烦恼。与InputStream相关的开销相比,开销可能没有您想象的那么大。

我不知道您正在消费的Observable.using()的性质,但您应该考虑Operator安全地关闭这些资源(终止或取消订阅时)。

你对写一个支持Operator的背压犹豫不决是绝对正确的。除非你正在编写现有的map(),否则踩踏是非常棘手的。