我正在构建一个使用TweetStream的Sinatra应用程序(使用EventMachine侦听推文)。我也希望该应用程序像普通的Sinatra应用程序一样提供页面,但看起来Sinatra在“倾听”推文时无法“收听”页面请求。
这是我可以通过使用其他服务器或以不同方式构建我的应用程序来解决的问题吗?我尝试过使用WebBrick和Thin。
基本上我正在做的事情:
class App < Sinatra::Base
# listening for tweets
@client = TweetStream::Client.new
@client.track(terms) do |status|
# do some stuff when I detect terms
end
get '/' do
"Here's some page content!"
end
end
答案 0 :(得分:5)
您可以在事件机器中安装Sinatra应用程序(为您提供支持EM的瘦客户机,即Thin)。然后,您应该可以从Sinatra应用程序完全访问EM反应器循环,并允许任何其他EM插件运行。
Sinatra食谱有一个很好的例子:
http://recipes.sinatrarb.com/p/embed/event-machine
这是一个非常简化的代码版本:
require 'eventmachine'
require 'sinatra/base'
require 'thin'
def run(opts)
EM.run do
server = opts[:server] || 'thin'
host = opts[:host] || '0.0.0.0'
port = opts[:port] || '8181'
web_app = opts[:app]
dispatch = Rack::Builder.app do
map '/' do
run web_app
end
end
unless ['thin', 'hatetepe', 'goliath'].include? server
raise "Need an EM webserver, but #{server} isn't"
end
Rack::Server.start({
app: dispatch,
server: server,
Host: host,
Port: port
})
end
end
class HelloApp < Sinatra::Base
configure do
set :threaded, false
end
get '/hello' do
'Hello World'
end
get '/delayed-hello' do
EM.defer do
sleep 5
end
'I\'m doing work in the background, but I am still free to take requests'
end
end
run app: HelloApp.new
答案 1 :(得分:0)
如果您真的想使用推文流功能,那么您需要将流媒体部分作为一个单独的流程运行,并将其结果写入数据库,然后从您的sinatra应用程序中读取这些记录。
这就是它的工作原理twitter流监听器与你的sinatra应用程序是一个单独的东西,你需要某种队列加入它们,比如redis或db,或类似的东西。