使用Observable.timeout后超时后会发生什么?

时间:2016-04-12 13:01:01

标签: java rx-java reactivex

我有Observable进入数据库并查询某些信息。我不希望我的可观察执行时间超过5秒,因此我使用:

myObservable.timeout(5,second);

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

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

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

1 个答案:

答案 0 :(得分:2)

让我们举个例子:

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

timeout运算符将发出错误。但先例运营商不会成为这个错误的通知者。

操作员onErrorReturn会将您的错误转换为事件,然后完成您的信息流(并将其标记为已完成),然后您的源可观察信息将取消订阅。

这个取消订阅部分将运行一些代码,这些代码可能会停止您的请求,或者什么都不做,或者释放一些资源,这取决于您的源可观察源的编写方式。

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