2

Juggernaut、Redis、SQLite、Rails3.1を使用して簡単なリアルタイムチャットを作成しています

別のユーザーが切断されたとき(たとえば、ウィンドウを閉じたとき)にすべてのユーザーに新しいメッセージを書き込みたいのですが、これはJuggernautのクライアント切断イベントをリッスンするためです。

Juggernaut docsによると、これはサーバー側で実行できます(Ruby)

Juggernaut.subscribe do |event, data|
  # Use event/data
end

問題は、このコードをRailsアプリ内のどこに配置すればよいかわからないことです(コントローラー、モデル、オブザーバー?)。モデルに配置しようとしましたが、サーバーは、モデルにそのコードのチャンクを含む要求に応答しません。

ユーザーがウィンドウを閉じたために切断された場合、そのユーザーの「クライアント側」がないため、サーバー側からそのイベントをリッスンする必要があると思います。

おそらく、私はJuggernautがどのように機能するかについて何かが欠けています。どんな助けでもありがたいです。

4

1 に答える 1

6

さて、ついに私は自分自身に答えています:

問題は、実行中のプロセスがJuggernaut.subscribeを呼び出すと、Juggernautイベントがトリガーされるまでフリーズすることです。したがって、サーバープロセスからJuggernautを呼び出すことはできません。そのコードを実行するには、新しいプロセスが必要です。

私のコードは次のようになります。モデル:

class MyModel < ActiveRecord::Base

  class << self
    def subscribe
      Juggernaut.subscribe do |event, data|
        case event
          when :subscribe
            # do something
          when :unsubscribe
            # do something else
        end
      end
    end
  end

end

そして、私はルビースクリプトmyapp / scripts / juggernaut_listenerを持っています:

#!/usr/bin/env ruby
require File.expand_path('../../config/environment',  __FILE__)

puts "Starting juggernaut listener"
MyModel.subscribe

したがって、サーバーを昼食した後、次のようにJuggernautリスナーを昼食する必要があります。

./script/participations_listener

(スクリプトに+ xを指定する必要があることに注意してください)。

それが誰かに役立つことを願っています!

于 2011-08-08T06:59:31.647 に答える