私は(redis)pub/subサブスクライバも追加する必要があるRails(web)アプリケーションを持っています。Railsアプリケーションでpubsubサブスクライバを起動する方法
以下は、PubsubSubscriberクラスです。これは、アプリの起動に必要なものです。
redis接続は、resque.rb初期化ファイルに作成されます。私は、接続後PubsubSubscriber.newを試してみましたが、私はでそれがハングレールのサーバを起動しようとすると:サーバーが正常に起動したときとは対照的に
=> Booting Thin
=> Rails 3.2.13 application starting in development on http://0.0.0.0:5000
=> Call with -d to detach
=> Ctrl-C to shutdown server
:
=> Booting Thin
=> Rails 3.2.13 application starting in development on http://0.0.0.0:5000
=> Call with -d to detach
=> Ctrl-C to shutdown server
>> Thin web server (v1.5.1 codename Straight Razor)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:5000, CTRL+C to stop
任意のアイデアなぜサーバーイニシャライザでPubsubSubscriberクラスのインスタンスを作成しようとするとハングしますか?これを始めるのに良い場所はありますか?あなたが持っている
# example modified from https://github.com/redis/redis-rb/blob/master/examples/pubsub.rb
class PubsubSubscriber
def initialize
$redis.psubscribe(:channel_one) do |on|
on.psubscribe do |event, total|
end
on.pmessage do |pattern, event, message|
# message received, kick off some workers
end
on.punsubscribe do |event, total|
end
end
end
end
thats通常、subscribeコールは '永遠に'ブロックします。イベントマシンや別のプロセス/スレッドで実行する必要があります –
私はThinを使用しています。ハンドルはEMのものと同じように聞こえるので、EM.runを明示的に呼び出す必要はありません。私はThread.new {PubsubSubscriber.new}を試しましたが、それもブロックしています。提案? – 99miles
オブジェクトのコンストラクタは、ブロッキングイベントを実行する場所ではなく、実行中のクエリなどの何かを実行する場所ではありません。これは、オブジェクトの初期化にのみ使用する必要があります。 Ruby Objectシステムが、オブジェクトが正しく作成されるためにコンストラクタが終了するのを待っているなら、私は驚くことはありません。ですから、これをコンストラクタの外で 'start'のような別のメソッドに移動し、' Thread.new {PubsubSubscriber.new.start} 'のように実行してみてください。 – Subhas