2009-10-21 4 views
7

少数のアクションでかなりの計算時間が必要なRailsアプリケーションがあります。これらのアクションをバックグラウンドタスクとして管理する複雑さを克服するのではなく、処理を複数のスレッドに分割し、マルチコアサーバでJRubyを使用することで、すべてのスレッドが妥当な時間内に完了することを保証できます。 (顧客は、このアプローチを維持することに対して、バックグラウンドでタスクを実行するのに対して強い関心を示しています)。Railsアプリケーションのスレッド内でのログ

問題は、これらのスレッド内でRailsロガーへの書き込みが機能しないことです。ログファイルには何も表示されません。私はこの問題にいくつかの言及を見つけましたが、解決策はありませんでした。私はデバッグを助けるために私のコードにputsを挿入しても構いませんが、stdoutはglassfish gem appサーバーによって食べられるようです。

誰かが毎回新しいログを作成せずにRailsのRubyスレッドのログを正常に終了しましたか?

+0

更新:スレッドのputsがglassfishログファイルに表示されることがわかりました。なぜ私はこれを見たことがないのか分かりません。私はもともと別の(非メイン)スレッドによって生成されたスレッドでそれをテストしたかもしれません。とにかく、デバッグの目的で、私はSTDOUTへのログファイルへの書き込みを見ているので、私は満足しています。 –

答えて

4

私は同じ問題で頭を傷つけていました。私の答えは以下の通りです:

Thread.new do 
    begin 
    ... 
    ensure 
    Rails.logger.flush 
    end 
end 
+0

いいね!ありがとう! –

+0

私はEMを使用していません – skrat

0

私はバックグラウンドタスクに関する懸念を理解していますが、Railsのスレッドをスピンオフすることは恐ろしいことです。このフレームワークでは、マルチスレッドのための規定がないため、すべてのRailsオブジェクトをスレッドセーフではないものとして扱わなければなりません。データベース接続さえ難しいです。

ロガーについて:標準のRubyロガークラスはスレッドセーフである必要があります。しかし、Railsがそれを使用していても、Railsアプリケーションが何をしているのかはあなたが制御できません。例えば、ベンチマークメカニズムはレベルを切り替えることによってロガーを「沈黙させる」。

私はレールロガーを使用しないでください。スレッドを使用する場合は、その操作のメッセージを記録するスレッド内に新しいロガーを作成します。スレッドごとに新しいログを作成したくない場合は、各スレッドがアクセスできるスレッドセーフなロギングオブジェクトを実行時に作成することもできます。

あなたの場所では、バックグラウンドの仕事の解決策をもう一度見ているでしょう。 DRbは悪夢のように見えますが、「bj」は素敵で簡単です。 JRubyで動作させるにはいくつかの作業が必要でしたが、また、JRubyのJavaスケジューラを使用する代わりに、http://www.jkraemer.net/2008/1/12/job-scheduling-with-jruby-and-rails

+0

情報と提案をお寄せいただきありがとうございますが、この時点では、ロギングを除いて正常に動作しているため、スレッド・アプローチに固執します。私はどのスレッドでも疑わしい宝石/プラグインを使用していないので、競合状態を防ぐためにmutexを使用することには注意が必要です。 Railsロガーを使用することに興味がありましたが、デバッグが簡単でした.JRUBY_VERSIONが定義されている場合にのみスレッドを使用し、同じコードを順番に実行することで回避できました。とにかくありがとう! –

関連する問題