私は長い間うまく機能しているアプリを持っています。スレッドセーフをオンにしていますが、モデルファイルの1つが見つからないと言って、DelayedJobが機能していません。
ジョブのロードに失敗しました:未定義のクラス/モジュールFoo
これは/libで定義したカスタムジョブクラスではありません。これはapp/modelsのモデルファイルです。
このクラスがロードされない原因は何ですか?
私は長い間うまく機能しているアプリを持っています。スレッドセーフをオンにしていますが、モデルファイルの1つが見つからないと言って、DelayedJobが機能していません。
ジョブのロードに失敗しました:未定義のクラス/モジュールFoo
これは/libで定義したカスタムジョブクラスではありません。これはapp/modelsのモデルファイルです。
このクラスがロードされない原因は何ですか?
あなたが記録した問題に投稿されたように、他の人がこのSO投稿を最初に見つけた場合:
私もこの問題にぶつかりました...そして私が見つけたものは次のとおりです:アプリがrakeタスクを介してロードされた場合、Railsはクラスをロードすることを熱望しません(そしてそれがDJのやり方です)。
だから私がやったことは私のproduction.rb
:のこのコードスニペットです
# Enable threaded mode, unless a rake task (likely Delayed Job) is running:
config.threadsafe! unless defined?($rails_rake_task) && $rails_rake_task
Railsは、レーキタスクによってロードされるときにそのグローバル変数を設定します。醜いですが、今はうまく機能しているようです...もちろん、マルチスレッドのrakeタスクがある場合、これは理想的ではないため、Rails.application.eager_loadを呼び出す必要があります。それらのタスクのために。ただし、マルチスレッドのレーキタスクはまれだと思います。
レーキジョブにスレッドセーフを使用しないというpatの方法を使用した後でも、私のジョブはまだ失敗していました。
結局、 GitHubWikiページにある次の手動読み込み手法を使用する必要がありました。
# file: config/initializers/custom.rb
require 'my_custom_class'
あまり関係はありませんが、スレッドセーフを有効にせずに、ジョブが遅れてまったく同じエラーメッセージが表示されました。
理由と解決策ははるかに簡単でした-遅延ジョブを使用する別のルビー製品がサーバー上にあり、そのワーカーはキューに名前を付けていなかったため、私が設定したキューからランダムなジョブを取得していました。