2

だから、私はRailsを使って小さなアプリケーションを構築しています。ユーザーステータスを変更するためのコマンドを少し使ってユーザーに通知するには、XMPPプロトを使用する必要があります。

以前のバージョンは、DBへのプレーンSQLリクエストでプレーンPython(かなり醜いアプリ)を使用するアプリケーションでした。テーブル「jabber_queue」があったため、別のスクリプトでは、ボットは1秒ごとに行をチェックし、処理(メッセージの送信)、削除を行っていました。シンプルでバカでしたが、大丈夫でした。

わかりました。このボット機能をRailsに統合する必要があります(少なくともRSpecで動作するため)。

これは、それがどのように行われるかについての私のいくつかのバージョンです。

  1. 分離された非同期キューソリューションを使用します。たとえば、Resque。分離されたRubyスクリプトを使用し、イベントをResqueにプッシュし、アプリケーションのイベントをポップします(DBに依存しないため、RSpecテストおよびテストDBに簡単に適合します)。しかし、それは私のアプリケーションを少し肥大化します-私は多くのメモリとCPUの追加要件を持つ2番目のDBを使用する必要があります-それは私の問題のオーバーヘッドになります。また、私はこのアプリケーションのために追加の「もの」をサポートしたくありません、私は知っています、それははるかに簡単な方法で行うことができます。

  2. delayd_job(現在のAR DBを使用したキューソリューション)を使用します。しかし、Railsアプリケーションの現在のARDBを別のスクリプトで取得する方法がわかりません。とにかく、それは汚くて醜い方法です。

  3. バックグラウンドワーカーとして、Railsアプリケーション内でXMPPボットを起動します。したがって、ワーカーは「現在の」AR(テストの場合はtest-DB)にアクセスできます。しかし、私は単にそれを行う方法がわかりません。Navvyを見つけましたが、Railsのどこかに「Navvy :: Job.enqueue(Cow、:speak)」のような文字列を開始する必要があります。これを開始するには、どこが最適かわかりません。 RSpecテストと「railsserver」を使用します。また、BackgrounDRbもありますが、このプロジェクトはNavvyに似ており、非アクティブでもあります。stackoverflowで検索を使用して、私と同様の問題を見つけましたが、解決策はbackground_jobにつながります。これはバックグラウンドで何でも可能ですが、別のスクリプトで現在のARDBアクセスを取得する方法がわかりません。

私の問題のこの量の言葉をとても残念に思います、それはただの頭脳です。いくつかの解決策がありますが、経験豊富な開発者からのアドバイスと言葉が本当に必要です。

4

1 に答える 1

1

だから、これははい、3番目の方法を使用して解決されました。

  1. ボットコマンドとARモデルを処理するためのクラスを作成しました- awesomo.rb。特別なことは何もありません。/lib/これをRailsプロジェクトに入れました。第二に、

  2. パスワードとJIDを簡単に設定するための構成ファイルを作成しました-config/awesomo.yml

    development:
      xmpp_jid: ...
      xmpp_password: ...
    
  3. ボット用のデーモンを作成しました- awesomo_daemon.rb。同じ、で/lib/。これが含まれているものです:

    #preload rails environment
    require File.expand_path(File.join(File.dirname(__FILE__),
         '..', 'config', 'environment'))
    
    #load xmpp bot class
    require 'awesomo_daemon'
    
    #load xmpp bot configuration file for current environment
    AWESOMO_CONFIG = YAML.load_file(File.join(File.dirname(__FILE__),
        '..', 'config', 'awesomo.yml'))[Rails.env]
    
    #apply configuration before singleton will be initiated
    Awesomo.setup AWESOMO_CONFIG['xmpp_jid'], AWESOMO_CONFIG['xmpp_password']
    
    loop {
      Awesomo.instance.idle
      sleep 1
    }
    
  4. デーモンスクリプトスターターを作成しました- script/awesomo

    #!/usr/bin/env ruby
    require 'rubygems'
    require 'daemons'
    Daemons.run "lib/awesomo_daemon.rb", dir_mode: :normal,
        dir: File.join(File.dirname(__FILE__), '..', 'tmp', 'pids')
    
  5. コマンドで実行するだけscript/awesomo startです。

そして、私は自分のモデルを使用できますawesomo.rb!また、キューには、小さなモデルを使用しています-フィールドjtype(たとえば、 "xmpp_message")、body( "hey!")、to( "john@jabber.com")を持つXMPPJob。awesomo.rb idleを使用してボットクラスの関数内でそれをフェッチしますlimit(5).each do |job| case jtype ...

私の「awesomo」の新しい仕事を投稿するために、私は関数を使用していますsend_message

def self.send_message to, body
  xmppjob = XmppJob.new :jtype => "xmpp_message", :body => body, :to => to
  xmppjob.save
end

XMPP library()自体を除いて、すべてが完全に機能しますが、。xmpp4r-simpleだけを使用してすぐに書き直しますxmpp4r

于 2012-09-19T21:43:18.753 に答える