Как остановить фоновый поток в Синатре, когда соединение закрыто - PullRequest
2 голосов
/ 03 октября 2011

Я пытаюсь использовать API потоковой передачи Twitter с помощью Sinatra и предоставлять пользователям обновления в режиме реального времени при поиске по ключевому слову.

require 'sinatra'
require 'eventmachine'
require 'em-http'
require 'json'

STREAMING_URL = 'https://stream.twitter.com/1/statuses/sample.json'

get '/' do
  stream(:keep_open) do |out|
    http = EM::HttpRequest.new(STREAMING_URL).get :head => { 'Authorization' => [ 'USERNAME', 'PASS' ] }
    buffer = ""
    http.stream do |chunk|
      puts "still chugging"
      buffer += chunk
      while line = buffer.slice!(/.+\r?\n/)
        tweet = JSON.parse(line)
        unless tweet.length == 0 or tweet['user'].nil?
            out << "<p><b>#{tweet['user']['screen_name']}</b>: #{tweet['text']}</p>" 
        end
      end
    end
  end
end

Я хочу, чтобы обработка потока em-http-запроса прекратилась, если пользователь закрывает соединение. Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

5 голосов
/ 03 октября 2011

Ответ Эрика был близок, но он закрывает тело ответа (не клиентское соединение, кстати), как только ваш твиттер-поток закрывается, что обычно никогда не происходит.Это должно работать:

require 'sinatra/streaming' # gem install sinatra-contrib
# ...

get '/' do
  stream(:keep_open) do |out|
    # ...
    out.callback { http.conn.close_connection }
    out.errback { http.conn.close_connection }
  end
end
0 голосов
/ 03 октября 2011

Я пока не совсем знаком с потоковым API Синатры, но вы пробовали это?

http.callback { out.close }

...