2012-02-20 11 views
2

私はEventMachineの初心者ですから、私はこれに完全に間違っている可能性があります。私がしようとしているのは、EM接続(実際にはBlatherストリームですが、それはEM :: Connection)を作成することです。アプリケーションが起動すると、いつでも必要なときにいつでも起動できます。今、このSinatraアプリケーションでBlatherが正しく動作する唯一の方法は、毎回新しい接続を作成し、EM.runブロック内にラップすることです。Sinatraアプリケーションで永続的なEM接続を1つ維持する

私は、async_sinatraが役立つかどうかを判断しようとしています。しかし、リクエストが非同期的に発生した場合、私は実際に気にしません。私はそれがいいと思うが、私は依頼間のつながりをどのように維持するか見ていない。

私の頭脳の中で最も意味があると思われる解決策は、Sinatra configureブロック内の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

アプリケーションをどのように実行しますか?複数の従業員を使用する場合は、各従業員ごとに1つの接続が得られますが、それは問題ですか? – Schmurfy

+0

アプリケーションをデプロイするときは、Cedarスタックを使用することを忘れないでください。そのため、EventMachineはそのスタックでのみサポートされています。 –

答えて

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を持つlocalhost上のサーバに送信すると、Webブラウザからインデックスページが要求されたときに受信したものが格納されて表示されます。

保存この「config.ru」ファイルとでこれを実行します。私の場合は

$ thin start -V 

ポート4000上のサーバーは、(私はマックOS Xで午前、Linuxはまた、それを持っている)であった。

$ nc -l 4000 

開いている接続を置き換えてください。

関連する問題