在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
答案 0 :(得分:1)
如果您的观察者不遵守Observable合同(特别是排放需要连续),您可以获得MissingBackpressureException
下游的onBackpressureDrop
。如果您使用PublishSubject
并从不同线程调用subject.onNext
,那么您需要序列化其排放:
PublishSubject<T> subject = ...;
subject
.serialize()
.onBackpressureDrop()
.observeOn(...)
...