【发布时间】:2018-02-22 14:37:19
【问题描述】:
我已经按照 RxJava2 wiki (https://github.com/ReactiveX/RxJava/wiki/Writing-operators-for-2.0#operator-targeting-lift) 中的描述实现了 FlowableOperator,只是我在 onNext() 操作中执行了一些类似这样的测试:
public final class MyOperator implements FlowableOperator<Integer, Integer> {
...
static final class Op implements FlowableSubscriber<Integer>, Subscription {
@Override
public void onNext(Integer v) {
if (v % 2 == 0) {
child.onNext(v * v);
}
}
...
}
}
这个运算符是一个链的一部分,我在其中创建了一个带有背压下降的Flowable。本质上,它看起来几乎是这样的:
Flowable.<Integer>create(emitter -> myAction(), DROP)
.filter(v -> v > 2)
.lift(new MyOperator())
.subscribe(n -> doSomething(n));
我遇到了以下问题:
- 出现背压,因此
doSomething(n)无法处理即将到来的上游 - 由于选择了背压策略,项目被丢弃
- 但是 doSomething(n) 在执行 drop 之后永远不会收到新项目,而 doSomething(n) 已准备好处理新项目
回顾 David Karnok 的优秀博文 http://akarnokd.blogspot.fr/2015/05/pitfalls-of-operator-implementations.html,看来我需要在 onNext() 方法中添加 request(1)。但那是用 RxJava1...
所以,我的问题是:这个修复在 RxJava2 中是否足以解决我的背压问题?还是我的操作员必须实现所有关于 Atomics 的内容,排空https://github.com/ReactiveX/RxJava/wiki/Writing-operators-for-2.0#atomics-serialization-deferred-actions 中描述的内容才能正确处理我的背压问题?
注意:我添加了request(1),它似乎可以工作。但我不知道这是否足够,或者我的操作员是否需要队列排水和原子等棘手的东西。
提前致谢!
【问题讨论】:
标签: rx-java2 backpressure