Ruby 将eventmachine与sinatra一起使用时,如何在不关闭所有http连接的情况下关闭一个http连接?
我有下面的代码,它将查询twitter流API中的某个字符串。当我打开两个带有不同查询的选项卡时,它们都可以工作。但是,当我停止其中一个选项卡时,另一个选项卡停止接收任何数据,服务器停止处理流。我怎样才能解决这个问题Ruby 将eventmachine与sinatra一起使用时,如何在不关闭所有http连接的情况下关闭一个http连接?,ruby,sinatra,eventmachine,Ruby,Sinatra,Eventmachine,我有下面的代码,它将查询twitter流API中的某个字符串。当我打开两个带有不同查询的选项卡时,它们都可以工作。但是,当我停止其中一个选项卡时,另一个选项卡停止接收任何数据,服务器停止处理流。我怎样才能解决这个问题 require 'sinatra' require 'eventmachine' require 'em-http' require 'json' require 'sinatra/streaming' enable :logging, :dump_errors, :raise_
require 'sinatra'
require 'eventmachine'
require 'em-http'
require 'json'
require 'sinatra/streaming'
enable :logging, :dump_errors, :raise_errors
get '/test/:query' do
q = params[:query]
the = 'him'
url = "https://stream.twitter.com/1/statuses/filter.json?track=#{q}"
stream(:keep_open) do |out|
http = EM::HttpRequest.new(url)
s = http.get :head => { 'Authorization' => [ 'USERNAME', 'PASSWORD' ] }
out.callback do
puts "callback"
http.conn.close_connection
end
out.errback do
puts "errback"
http.conn.close_connection
end
buffer = ""
s.stream do |chunk|
puts "what"
buffer += chunk
while line = buffer.slice!(/.+\r?\n/)
tweet = JSON.parse(line)
unless tweet.length == 0 or tweet['user'].nil? or out.closed?
out << "<p><b>#{tweet['user']['screen_name']}</b>: #{tweet['text']}</p>"
end
end
end
end
end
需要“sinatra”
需要“eventmachine”
需要'emhttp'
需要“json”
需要“sinatra/流媒体”
启用:日志记录、:转储错误、:引发错误
获取“/test/:query”do
q=参数[:查询]
“他”
url=”https://stream.twitter.com/1/statuses/filter.json?track=#{q} "
溪流(:保持开放)请勿入内
http=EM::HttpRequest.new(url)
s=http.get:head=>{'Authorization'=>['USERNAME','PASSWORD']}
我不知道
“回调”
http.conn.close\u连接
结束
出去吧
把“errback”放回去
http.conn.close\u连接
结束
buffer=“”
s、 流do|chunk|
把“什么”
缓冲区+=块
而line=buffer.slice!(/。+\r?\n/)
tweet=JSON.parse(第行)
除非tweet.length==0或tweet['user'].nil?还是关了门?
问题是,一旦你打开第二个连接,Twitter就会关闭一个连接。尝试同时在两个终端中运行curl
此外,在试图找出问题所在的同时,我进行了一次相当小的重构以提高可读性:
require 'sinatra'
require 'sinatra/streaming'
require 'eventmachine'
require 'em-http'
require 'json'
enable :logging, :dump_errors, :raise_errors
template(:tweet) { "<p><b><%= @tweet['user']['screen_name'] %></b>: <%= @tweet['text'] %></p>" }
get '/test/:query' do |q|
stream(:keep_open) do |out|
http = EM::HttpRequest.new("https://stream.twitter.com/1/statuses/filter.json?track=#{q}")
EM.next_tick do
s = http.get :head => { 'Authorization' => ENV.values_at('USERNAME', 'PASSWORD') }
s.callback { out.close }
out.callback { s.close }
s.errback { out.close }
out.errback { s.close }
buffer = ""
s.stream do |chunk|
buffer << chunk
while line = buffer.slice!(/.+\r?\n/)
break if out.closed?
@tweet = JSON.parse(line)
out << erb(:tweet) if @tweet.length > 0 and @tweet['user']
end
end
end
end
end
需要“sinatra”
需要“sinatra/流媒体”
需要“eventmachine”
需要'emhttp'
需要“json”
启用:日志记录、:转储错误、:引发错误
模板(:tweet){“:”}
获取“/test/:query”do | q|
溪流(:保持开放)请勿入内|
http=EM::HttpRequest.new(“https://stream.twitter.com/1/statuses/filter.json?track=#{q} ))
下一步做什么
s=http.get:head=>{'Authorization'=>ENV.values_at('USERNAME','PASSWORD')}
s、 回调{out.close}
out.callback{s.close}
s、 errback{out.close}
out.errback{s.close}
buffer=“”
s、 流do|chunk|
缓冲器