开发者

How to stop a background thread in Sinatra once the connection is closed

开发者 https://www.devze.com 2023-04-09 20:40 出处:网络
I\'m trying to consume the twitter streaming API with Sinatra and give users real-time updates when they search for a keyword.

I'm trying to consume the twitter streaming API with Sinatra and give users real-time updates when they search for a keyword.

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

I want the processing of the em-http-request stream to stop if the user closes the connection. Does anyone know how to do this?


Eric's answer was close, but what it does is closing the response body (not the client connection, btw) once your twitter stream closes, which normally never happens. This should work:

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


I'm not quite familiar with the Sinatra stream API yet, but did you try this?

http.callback { out.close }

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号