2011-11-11 19 views
5

私はXMPPを使用していますが、メッセージのコールバックはすべてのメッセージが送信されたときにアクティブになります。私の目的は、メッセージによって到着するデータをコールバック内のAPIに送信し、応答に基づいてXMPPクライアントを使用して何かを返すことです。RubyでAjaxのような非同期メソッドを呼び出す

  1. ユーザータイプのメッセージ(ブラウザチャットクライアント)が
  2. メッセージは
  3. メッセージが
  4. 応答がチャットクライアントに返送され
  5. レスポンスを受信したAPIに送信されるXMPPを介してサーバに到着します。

admin_muc_client.activate_message_callbacks do |m|    
    sender = m.from.resource 
    room_slug = m.from.node 
    message = m.body     

    r = HTTParty.get('http://example.com/api/v1/query?msg=message') 
    Rails.logger.debug(r.inspect) 
    admin_muc_client.send_message("Message #{r.body}") if m.from.resource != 'admin' 
end 
を次のように、このための私のコードがある

ここでの私の関心は、コールバックがイベント化され、APIへのリクエストは、ブロッキング呼び出しになりますので、これはアプリケーション全体のボトルネックになる可能性があることです。 私はJavascriptのためのAJAXのようなものを使用してリクエストを起動し、応答が利用可能なときにデータを送信することを好むでしょう。 Rubyでこれをどのように実装できますか?

私はdelayed_jobとbackgroundrbを見ましたが、それらは火災や忘れのためのツールのようです。私は応答と非同期の方法でコールバックをアクティブにする何かが必要になります。

私が望む非同期動作を実現する方法について、本当に本当に助けていただきたいと思います。私はRabbitMQのようなメッセージキューにも精通していますが、これはかなりの複雑さが増していると感じています。

答えて

5

girl_fridayを見ましたか?ウィキから -

girl_fridayは非同期タスクを実行するためのRubyライブラリです。メールを送信するなどのタスクを実行することでWebレスポンスをブロックしたくない場合が多いので、この宝石をバックグラウンドで使用することができます。これは、Rails 3アプリケーションを含むあらゆるRubyアプリケーションで動作します。

他の非同期ソリューション(Resque、dj、など)の数を使用してみませんか? girl_fridayはこれらのソリューションよりも簡単で効率的です:girl_fridayはRailsプロセスで実行され、安全な並行性のためにアクターパターンが使用されます。同じプロセスで実行されるため、別々のプロセスセットを監視したり、別々のコードベースを展開したり、これらのプロセス用にRAMに数百MBのRAMを無駄にする必要はありません。詳細については、Rubyのアクター紹介をご覧ください。

スレッドセーフなコードを記述する必要があります。これは難しいことではありません。アクターのパターンとは、メッセージを受け取り、そのメッセージを処理することを意味します。ロックが必要な共有データはなく、アプリケーションコードにデッドロックが発生する可能性があります。 girl_fridayはスレッドのカバーを使用しているため、Ruby環境でスレッドを効率的に実行できるようにする必要があります。 JRuby、Rubinius 1.2、Ruby 1.9.2は、ほとんどのアプリケーションで十分です。 Ruby 1.8のサポートは貧弱なスレッドサポートのためにサポートしていません。

これはあなたが探しているものだと思います。

+0

驚くばかりです。多分これはそれです。 – Sid

+0

私はこれがコンソールでは動作しますが、開発モードでアプリケーションで実行されたときにタスクをキューに追加しないことがわかります。 BTW私はdevモードで乗客とapacheを実行しています。 – Sid

関連する問題