2013-12-17 71 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