2011-10-03 12 views
2

我試圖在使用Sinatra時使用Twitter流媒體API並在用戶搜索關鍵字時爲用戶提供實時更新。一旦連接關閉,如何在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-request流。有誰知道如何做到這一點?

回答

5

Eric的回答很接近,但它的作用是關閉響應主體(而不是客戶端連接,順便說一句),一旦你的Twitter流關閉,這通常不會發生。這應該工作:

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 
+1

我剛剛爲Sinatra添加了多重回調支持,因此在下一個Sinatra版本中,此示例不再需要sinatra-contrib。 –

+0

該回調確實有效,但em-http-request不響應關閉或取消綁定(例如http.close)。有任何想法嗎? – aciniglio

+1

'http.conn.close_connection'應該可以工作。 –

0

我對Sinatra流API還不是很熟悉,但是你試過這個嗎?

http.callback { out.close }

+0

不幸的是,這是行不通的。雖然謝謝! – aciniglio

相關問題