2012-02-20 19 views
2

我是一個EventMachine新手,所以有機會我完全錯誤地接近它。我試圖做的是在應用程序啓動時創建一個EM連接(實際上是一個Blather流,但這是一個EM :: Connection),然後我可以在需要時點擊它。現在,我可以Blather在此Sinatra應用程序中正確工作的唯一方法是每次都創建一個新連接,並將其封裝在EM.run塊中。在Sinatra應用程序中維護一個永久的EM連接

我一直在試圖確定async_sinatra是否有幫助。但是,如果請求異步發生,我實際上並不在意。我想這會很好,但我仍然沒有看到我會如何堅持請求之間的連接。

似乎在我的大腦中最有意義的解決方案是在Sinatra配置塊內的EM塊中設置連接,但是我不確定如何在路上訪問它。不過,也許我錯過了某種基本的東西。

p.s.這將最終在Heroku上運行,所以儘管我非常感謝任何見解,但在Heroku上工作的解決方案將是最有用的。

編輯:

這似乎是在做我想要的東西,當地至少:

class Dashboard < Sinatra::Base 
    configure do 
    Thread.start do 
     EM.run do 
     @@xmpp_stream = Blather::Client.setup('jid', 'password') 
     @@xmpp_stream.connect 
     end 
    end 
    end 
end 
+0

你打算如何運行應用程序?如果你使用多個工人,你會得到每個工人的一個連接,這是一個問題嗎? – Schmurfy 2012-02-28 13:05:31

+0

部署應用程序時,不要忘記使用Cedar堆棧,因爲EventMachine僅在該堆棧上受支持。 – 2012-05-10 10:34:52

回答

1

這裏是東西入手:

require 'rack' 
require 'sinatra/base' 
require 'eventmachine' 

class EMHandler < EM::Connection 
    attr_reader :data 

    def initialize(obj) 
    @obj = obj 
    @data = "" 
    end 

    def receive_data(data) 
    @data << data 
    end 
end 

class PersistentConnection 
    def initialize(app, options = {}) 
    @app = app 
    EM::next_tick do 
     @server = EM::connect('127.0.0.1', 4000, EMHandler, self) 
    end 
    end 

    def call(env) 
    env['my_connection'] = @server 
    @app.call(env) 
    end 
end 

class Dashboard < Sinatra::Base 
get '/' do 
    env['my_connection'].data 
end 
end 

use PersistentConnection 
run Dashboard 

這將打開一個持久連接到端口爲4000的本地主機上的服務器,它將存儲從它接收的任何內容,並在通過Web瀏覽器請求索引頁時顯示它。

保存在一個「config.ru」文件,並運行此:

$ thin start -V 

在我的情況下在端口4000的服務器是(我在Mac OS X,Linux也有它):

$ nc -l 4000 

只需將我打開的連接替換爲所需的連接即可。