在OperatorObserveOn之前应用OperatorOnBackpressureDrop的MissingBackpressureException

时间:2016-10-18 17:55:56

标签: rx-java

MissingBackpressureException之前应用OperatorOnBackpressureDrop时发生了以下OperatorObserveOn

rx.exceptions.MissingBackpressureException 
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.onNext(OperatorObserveOn.java:162) ~[rxjava-1.1.10.jar:1.1.10] 
at rx.internal.operators.OperatorOnBackpressureDrop$2.onNext(OperatorOnBackpressureDrop.java:98) ~[rxjava-1.1.10.jar:1.1.10] 
at rx.subjects.PublishSubject$PublishSubjectProducer.onNext(PublishSubject.java:305) ~[rxjava-1.1.10.jar:1.1.10] 
at rx.subjects.PublishSubject$PublishSubjectState.onNext(PublishSubject.java:220) ~[rxjava-1.1.10.jar:1.1.10] 
at rx.subjects.PublishSubject.onNext(PublishSubject.java:73) ~[rxjava-1.1.10.jar:1.1.10]

我已按照JavaDoc中的建议在OperatorOnBackpressureDrop之前应用OperatorObserveOn(如上面的堆栈跟踪所示)。

来自Observable.observeOn(Scheduler) JavaDoc

  

"此操作员尊重下游的背压,并期望来自源Observable。违反此期望将导致MissingBackpressureException。这是弹出异常的最常见操作符;寻找不支持背压的链条上的源,例如间隔,计时器,{code PublishSubject}或BehaviorSubject,并在应用observeOn本身之前应用任何onBackpressureXXX运算符。"

我的具体用例是工作线程,每 ~600毫秒调用一个热的可观察PublishSubject.onNext(),观察者会收到 JavaFX应用程序的通知螺纹

不确定我在这里做错了什么,或者这是否是应该报告的RxJava错误。

环境: RxJava 1.1.10,Java 1.8.0_102

1 个答案:

答案 0 :(得分:1)

如果您的观察者不遵守Observable合同(特别是排放需要连续),您可以获得MissingBackpressureException下游的onBackpressureDrop。如果您使用PublishSubject并从不同线程调用subject.onNext,那么您需要序列化其排放:

 PublishSubject<T> subject = ...;
 subject
   .serialize()
   .onBackpressureDrop()
   .observeOn(...)
   ...