【问题标题】:What will happen after timeout when using Observable.timeout?使用 Observable.timeout 超时后会发生什么?
【发布时间】:2016-04-12 13:01:01
【问题描述】:

我有一个Observable 可以访问数据库并查询一些信息。我不希望我的 observable 执行时间超过 5 秒,因此我使用:

myObservable.timeout(5,second);

然后我也想处理错误通知,因此我使用:

myObservable.timeout(5,second).onError(return empty result);

然后我想知道myObservable中用于数据库查询的代码会发生什么。它也会被终止,还是会继续运行? (Java 原生 Future.get(timeLimit) 会发生这种情况)

【问题讨论】:

  • 您自己可能很容易回答这个问题。设置一个只休眠 10 秒的 Observable,试试上面的代码,看看会发生什么。

标签: java rx-java reactivex


【解决方案1】:

举个例子:

Observable.interval(1, TimeUnit.SECONDS)
            .timeout(10, TimeUnit.MICROSECONDS)
            .onErrorReturn(e -> -1L)
            .subscribe(System.out::println,
                       Throwable::printStackTrace,
                       () -> System.err.println("completed"));

timeout 运算符将发出错误。但先例运算符不会通知此错误。

运营商onErrorReturn 会将您的错误转换为事件,然后完成您的流(并将其标记为已完成),然后您的源 observable 将被取消订阅。

此取消订阅部分将运行一些代码,根据您的源 observable 的编写方式,这些代码可能会停止您的请求,或者什么也不做,或者释放一些资源。

在您的情况下,它可能会在您的Future 上调用cancel 方法(根据Subscriptions 类)

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2014-09-06
    • 2012-04-22
    • 2015-10-05
    相关资源
    最近更新 更多