将大型图形中的[rx]可观察异常跟踪到源代码

时间:2015-11-03 12:05:05

标签: exception-handling rx-java observable rx-scala

如果你有一个大的Observable图(即使用mergegroupByjoin等多次编写可观察图形,并且抛出异常,有时很难计算出来出异常的地方。我想知道是否有可能找到源文件中Observable操作符的位置。一个例子应该让这个更清楚。

例如,给定以下IllegalStateException: Only one subscriber allowed!和堆栈跟踪,我想知道是否可以找出行号operatorMergeoperatorFilter,{{在我的源文件中引发了1}}等。是否可以通过使用调试器,打印语句或其他方式以某种方式执行此操作?

operatorGroupBy

出现这个问题主要是因为Observable的整个要点是在执行时将a)代码与b)分离。但是对于调试程序来说,这是一场噩梦。因此,重复我上面的问题,我想知道是否可以在源代码中跟踪每个作文的原始行。

2 个答案:

答案 0 :(得分:1)

有一些关于额外调试信息的实验,但整个库运行速度慢100倍并被放弃。

问题很可能发生在你的groupBy之后的flatMap中,你订阅GroupedObservable并将其交还给现在无法订阅的flatMap:GroupedObservable只能被使用一次。您需要使用其中一个publish()replay()运算符并相应地调整函数逻辑。

答案 1 :(得分:0)

一年后,我仍然在努力解决这个问题,但仍未找到追踪执行情况的好方法。我发现我依赖于在代码中放置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")
        )
    }

这样可以快速编辑代码 - 只需在几个observable上编写myobservable.trace("My Observable"),这样就可以很容易地看到不同的生命周期事件发生的时间。