2016-04-12 2 views
2

У меня есть Observable, которые идут в базу данных и запрашивают некоторую информацию. Я не хочу, чтобы мои Наблюдаемые исполняет дольше, чем 5 секунд, таким образом, я использую:Что произойдет после таймаута при использовании Observable.timeout?

myObservable.timeout(5,second); 

Тогда я хочу, чтобы обработать уведомление об ошибке также, таким образом, я использую:

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

Тогда интересно, для чего произойдет с кодом в myObservable, который используется для запроса базы данных. Будет ли оно также прекращено или оно будет продолжаться? (Что происходит с Java Native Future.get(timeLimit))

+1

Вы, наверное, могли бы ответить на этот вопрос самостоятельно довольно легко. Настройте Наблюдаемый, который просто спит в течение 10 секунд, и попробуйте приведенный выше код, посмотрите, что произойдет. – dcsohl

ответ

0

Давайте рассмотрим пример:

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 класса)

Смежные вопросы