2013-12-17 30 views
4

我正在构建一个使用TweetStream(使用EventMachine监听Tweets)的Sinatra应用程序。我还希望该应用能够像普通的Sinatra应用一样提供页面,但是它似乎像Sinatra在“倾听”Tweets时不能“听”页面请求。如何运行EventMachine并在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 

回答

5

您可以在eventmachine中安装Sinatra应用程序(为您提供一个支持EM的awebserver,即Thin)。然后,您应该可以从Sinatra应用程序完全访问EM反应器循环,并允许其他任何EM插件也可以运行。

的西纳特拉的食谱有一个很好的例子:

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

正在使用EM.defer来完成这项工作?我正在使用一个使用EventMachine的库,所以如果出现这种情况,我可能需要对库或我的实现进行一些调整。另外如果将EM块放在Sinatra的get block外面会发生什么?我希望TweetStream在应用程序启动后立即启动。 – DorkRawk

0

,如果你真的想使用推特码流功能,那么你需要作为一个单独的进程中运行的流部分和写出来的结果说成数据库,然后从你的sinatra应用程序中读取这些记录。

这就是它的工作方式Twitter流侦听器与你的sinatra应用程序是分开的,你需要某种队列来加入它们,比如说redis或db,或者类似的东西。

+0

这是一个解决方案,我想出了。为TweetStream提供一个单独的应用程序,然后再从数据库中读取并运行一个站点。我只是希望将这些东西都包含到相同的代码库/应用程序中,因为这是一个相当小的应用程序。 – DorkRawk