2012-01-31 4 views
3

Я использую EventMachine + em-http-запрос для запроса API потоковой передачи Twitter. Он работает отлично, но теперь я хотел бы получить его доказательство ошибки.EventMachine/em-http-request Обнаруживать, когда соединение HTTP-потока застопорено

Что было бы лучшим способом обнаружить, что соединение застопорилось? (чтобы попытаться автоподтвердить).

У меня есть временное решение: каждый раз, когда я получаю новый кусок из метода stream, я сохраняю текущую временную метку. PeriodicTimer проверяет эту временную метку и выдает пересоединение всякий раз, когда последняя метка времени составляет более 30 секунд. Проблема с этим решением заключается в том, что он не имеет никакого значения между застопоренным соединением и рабочим соединением без содержимого.

Благодарим за помощь.

+1

Поскольку вы используете http, который использует TCP-соединения, вы должны получать уведомление о произошедшем отключении. Я не уверен, как em-hhtp-request обрабатывает его, но я уверен, что это так, просто выполните некоторые тесты с локальным сервером. – Schmurfy

ответ

3

Вы можете прикрепить errback обратного вызова к объекту запроса:

http.errback { puts 'error or timeout' } 

С эм-HTTP-запроса wiki:

функция Errback вызывается только в случае неудачного соединения такого как тайм-аут или неправильное имя DNS-сервера.

Лично я предпочитаю использовать Фарадей, а не работать с сырой библиотекой эм-HTTP-запрос:

require 'faraday' 

http = Faraday.new do |b| 
    b.adapter :em_http 
end 

res = http.get 'http://whatcodecraves.com' 
puts res.body 

Вот tutorial for Faraday. И если вы работаете с API-интерфейсом twitter streaming, here's a gotcha, чтобы не забывать. Удачи!