Exception handling 在大图中将[rx]可观察到的异常跟踪到源代码
当您有一个大的可观察图形(即使用Exception handling 在大图中将[rx]可观察到的异常跟踪到源代码,exception-handling,rx-java,observable,rx-scala,Exception Handling,Rx Java,Observable,Rx Scala,当您有一个大的可观察图形(即使用merge、groupBy、join等多次合成的可观察图形)并且抛出异常时,有时很难找出异常的来源。我想知道,是否有可能找出在源文件中,可观察到的操作符在哪里被调用。举个例子可以让这一点更清楚 例如,给定以下非法状态异常:只允许一个订户和堆栈跟踪,我想知道是否有可能找出源文件中调用的行号运算符merge、运算符filter、运算符groupby等。是否可以通过使用调试器、打印语句或其他方式来执行此操作 java.lang.IllegalStateException
merge
、groupBy
、join
等多次合成的可观察图形)并且抛出异常时,有时很难找出异常的来源。我想知道,是否有可能找出在源文件中,可观察到的操作符在哪里被调用。举个例子可以让这一点更清楚
例如,给定以下非法状态异常:只允许一个订户代码>和堆栈跟踪,我想知道是否有可能找出源文件中调用的行号运算符merge
、运算符filter
、运算符groupby
等。是否可以通过使用调试器、打印语句或其他方式来执行此操作
java.lang.IllegalStateException: Only one subscriber allowed!
at rx.internal.operators.BufferUntilSubscriber$OnSubscribeAction.call(BufferUntilS
ubscriber.java:124)
at rx.internal.operators.BufferUntilSubscriber$OnSubscribeAction.call(BufferUntilS
ubscriber.java:81)
at rx.Observable$1.call(Observable.java:144)
at rx.Observable$1.call(Observable.java:136)
at rx.Observable.unsafeSubscribe(Observable.java:7531)
at rx.internal.operators.OperatorGroupBy$GroupBySubscriber$2.call(OperatorGroupBy.
java:251)
at rx.internal.operators.OperatorGroupBy$GroupBySubscriber$2.call(OperatorGroupBy.
java:236)
at rx.Observable$1.call(Observable.java:144)
at rx.Observable$1.call(Observable.java:136)
at rx.Observable$1.call(Observable.java:144)
at rx.Observable$1.call(Observable.java:136)
at rx.Observable$1.call(Observable.java:144)
at rx.Observable$1.call(Observable.java:136)
at rx.Observable$1.call(Observable.java:144)
at rx.Observable$1.call(Observable.java:136)
at rx.Observable$1.call(Observable.java:144)
at rx.Observable$1.call(Observable.java:136)
at rx.Observable$1.call(Observable.java:144)
at rx.Observable$1.call(Observable.java:136)
at rx.Observable$1.call(Observable.java:144)
at rx.Observable$1.call(Observable.java:136)
at rx.Observable.unsafeSubscribe(Observable.java:7531)
at rx.internal.operators.OperatorMerge$MergeSubscriber.handleNewSource(OperatorMer
ge.java:215)
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:1
85)
at rx.internal.operators.**OperatorMerge**$MergeSubscriber.onNext(OperatorMerge.java:1
20)
at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:55)
at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:55)
at rx.internal.operators.SingleDelayedProducer.emit(SingleDelayedProducer.java:80)
at rx.internal.operators.SingleDelayedProducer.set(SingleDelayedProducer.java:63)
at rx.internal.operators.OperatorToObservableList$1.onCompleted(OperatorToObservab
leList.java:93)
at rx.internal.operators.OperatorMap$1.onCompleted(OperatorMap.java:44)
at rx.internal.operators.**OperatorFilter**$1.onCompleted(OperatorFilter.java:42)
at rx.internal.operators.OperatorTakeUntilPredicate$ParentSubscriber.onNext(Operat
orTakeUntilPredicate.java:54)
at rx.internal.operators.OperatorDoOnEach$1.onNext(OperatorDoOnEach.java:84)
at rx.internal.operators.**OperatorGroupBy**$GroupBySubscriber$2$2.onNext(OperatorGrou
pBy.java:286)
at rx.internal.operators.BufferUntilSubscriber.onNext(BufferUntilSubscriber.java:1
81)
at rx.internal.operators.NotificationLite.accept(NotificationLite.java:150)
at rx.internal.operators.OperatorGroupBy$GroupBySubscriber.emitItem(OperatorGroupB
y.java:340)
at rx.internal.operators.OperatorGroupBy$GroupBySubscriber.onNext(OperatorGroupBy.
java:226)
at rx.internal.operators.OnSubscribeRefCount$2.onNext(OnSubscribeRefCount.java:124
)
at rx.internal.operators.OperatorPublish$PublishSubscriber.dispatch(OperatorPublis
h.java:560)
at rx.internal.operators.**OperatorPublish**$PublishSubscriber.onNext(OperatorPublish.
java:258)
at rx.internal.operators.OperatorMerge$InnerSubscriber.emit(OperatorMerge.java:676
)
at rx.internal.operators.OperatorMerge$InnerSubscriber.onNext(OperatorMerge.java:5
86)
at rx.internal.operators.OperatorMerge$InnerSubscriber.emit(OperatorMerge.java:676
)
at rx.internal.operators.OperatorMerge$InnerSubscriber.onNext(OperatorMerge.java:5
86)
at rx.internal.operators.OperatorMerge$InnerSubscriber.emit(OperatorMerge.java:676
)
at rx.internal.operators.OperatorMerge$InnerSubscriber.onNext(OperatorMerge.java:5
86)
at rx.internal.operators.OnSubscribeFromIterable$IterableProducer.request(OnSubscr
ibeFromIterable.java:98)
at rx.Subscriber.setProducer(Subscriber.java:177)
at rx.internal.operators.OnSubscribeFromIterable.call(OnSubscribeFromIterable.java
:50)
at rx.internal.operators.OnSubscribeFromIterable.call(OnSubscribeFromIterable.java
:33)
at rx.Observable.unsafeSubscribe(Observable.java:7531)
at rx.internal.operators.OperatorMerge$MergeSubscriber.handleNewSource(OperatorMer
ge.java:215)
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:1
85)
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:1
20)
at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:55)
at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:55)
at rx.internal.operators.OnSubscribeRefCount$2.onNext(OnSubscribeRefCount.java:124
)
at rx.internal.operators.OperatorPublish$PublishSubscriber.dispatch(OperatorPublis
h.java:560)
at rx.internal.operators.OperatorPublish$PublishSubscriber.onNext(OperatorPublish.
java:258)
at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:55)
at rx.internal.operators.OperatorScan$2.onNext(OperatorScan.java:112)
at rx.internal.operators.OperatorMerge$InnerSubscriber.emit(OperatorMerge.java:676
)
at rx.internal.operators.OperatorMerge$InnerSubscriber.onNext(OperatorMerge.java:5
86)
at rx.internal.operators.OperatorGroupBy$GroupBySubscriber$2$2.onNext(OperatorGrou
pBy.java:286)
at rx.internal.operators.BufferUntilSubscriber.onNext(BufferUntilSubscriber.java:1
81)
at rx.internal.operators.NotificationLite.accept(NotificationLite.java:150)
at rx.internal.operators.OperatorGroupBy$GroupBySubscriber.emitItem(OperatorGroupB
y.java:340)
at rx.internal.operators.OperatorGroupBy$GroupBySubscriber.onNext(OperatorGroupBy.
java:226)
at rx.lang.scala.Subscriber$$anon$3.onNext(Subscriber.scala:198)
...
这个问题的出现本质上是因为可观察的整体要点是在执行时将a)代码与b)代码解耦。但对于调试程序来说,这是一场噩梦。因此,重复我上面的问题,我想知道是否有可能在源代码中跟踪每个组合的原始行。有一些关于额外调试信息的实验,但整个库运行速度慢了100倍,因此被放弃
问题可能出现在groupBy之后的flatMap中,您在其中订阅GroupedObservable,并将其交还给现在无法订阅它的flatMap:GroupedObservable只能使用一次。您需要使用一个publish()
或replay()
操作符,并相应地调整函数逻辑。一年后,我仍然在努力解决这个问题,仍然没有找到跟踪执行情况的好方法。我发现我依赖于在代码中放入print语句来查看发生了什么。这是我唯一能找到正在发生的事情的线索的方法
我发现唯一有用的是为此创建一个模式,这样我就不必编写doOnNext(x=>println(x))
来显示每次都发生了什么:
implicit class ObservableTrace[T](o : rx.lang.scala.Observable[T]) {
import java.time.LocalTime
def trace(name : String) : rx.lang.scala.Observable[T] = {
def print(s: String) = println(s"${LocalTime.now} : $name : $s")
(o doOnNext (x => print("next:" + x))
doOnSubscribe print("subscribed")
doOnCompleted print("completed")
doOnError (e => print("error: " + e))
doOnUnsubscribe print("unsubscribed")
)
}
这使得编辑代码变得很快-只需在几个可观察对象上编写myobservable.trace(“我的可观察对象”)
,就可以很容易地看到不同的生命周期事件发生的时间。感谢您的评论;它确实是通过share
ing groupBy和嵌套的观察值来修复的。