ruby-on-rails - queue_as - rails job 実行



実行メソッドを実行せずにジョブ・キューを空にするDelayed_job (4)

delayed_jobのどのバージョンを実行していますか?

Rails 3.0以上では、 https://github.com/collectiveidea/delayed_jobの2.1ブランチが必要です。

https://src-bin.com

私は新鮮なレール3アプリを持って、ここに私のGemfile:

source 'http://rubygems.org'
gem 'rails', '3.0.0' gem 'delayed_job'
gem 'sqlite3-ruby', :require => 'sqlite3'

キューに入れたいジョブを表すクラスは次のとおりです。

class Me < Struct.new(:something)
   def perform
     puts "Hello from me"
     logger.info "Hello from me"
     logger.debug "Hello from me"
     raise Exception.new   
   end
end

実行中のワーカーがいないコンソールから:

irb(main):002:0> Delayed::Job.enqueue Me.new(1)
=> #<Delayed::Backend::ActiveRecord::Job id: 7, priority: 0, attempts: 0, handler: "--- !ruby/struct:Me \nsomething: 1\n", last_error: nil, run_at: "2010-12-29 07:24:11", locked_at: nil, failed_at: nil, locked_by: nil, created_at: "2010-12-29 07:24:11", updated_at: "2010-12-29 07:24:11">

私が言及したように:実行中の労働者はいません:

irb(main):003:0> Delayed::Job.all
=> [#<Delayed::Backend::ActiveRecord::Job id: 7, priority: 0, attempts: 0, handler: "--- !ruby/struct:Me \nsomething: 1\n", last_error: nil, run_at: "2010-12-29 07:24:11", locked_at: nil, failed_at: nil, locked_by: nil, created_at: "2010-12-29 07:24:11", updated_at: "2010-12-29 07:24:11">]

私はscript/delayed_job runして作業を開始しscript/delayed_job run

キューは空になります。

irb(main):006:0> Delayed::Job.all
=> []

しかし、putの結果として何も起こらず、 logger呼び出しから何も記録されず、例外も発生しません。 私は何か助けや洞察力や何かを試していただければ幸いです。


Answer #1

デフォルトでは、delayed_jobは失敗したジョブを破棄します。

最初のステップはイニシャライザを設定し、その動作を無効にすることです

Delayed::Worker.destroy_failed_jobs = false  

また、デシリアライゼーションに失敗した場合は、即座にジョブが失敗します。

これにより、ジョブの削除がトリガーされます(削除していない場合)。

だから、worker.rbの120行目に次の行を追加してみてください。

rescue DeserializationError => error
  say "DeserializationError: #{error.message}"
  job.last_error = "{#{error.message}\n#{error.backtrace.join('\n')}"
  failed(job)

それはかなり役に立たないですが、少なくともそれは非直列化エラーであることがわかります。

私はちょうど仕事wを使って終わった。 perform()メソッドの構造体。 はるかに信頼性の高い。 また、ジョブ定義を別のファイルとして保存して、クラスローダーがクラス定義をモデルのどこかにインライン展開するのではなく、実行中に見つけることができるようにしてください。


Answer #2

ログを確認すると、少なくともどのジョブが起動され、終了ステータスは何か、DelayedJobメッセージに関するものが表示されるはずです

ターミナルで、打ち上げ:

tail -f log/development.log

レールコンソールから再試行して、単純なActiveRecordクエリを実行した後にDelayedJobを使用して何が起きるかを確認してください。 あなたは他の端末に記録されているものを読むことができます

歓声、A.


Answer #3

私はあなたのクラスをirbにコピーして、 Me.new.performをやろうとしMe.new.perform

Hello from me
NameError: undefined local variable or method `logger' for #<struct Me something=nil>
from (irb):6:in `perform'
from (irb):14

あなたのクラスは「ロガー」にアクセスできますか?

ファイルを開いたり書き込んだりするなど、何か他のことをやってみることができますか?

File.open("testing.txt", 'w') {|f| f.write("hello") }

遅れている職員の「puts」コマンドは標準出力に出力されるので、おそらくこれを見ることはないでしょう。 また、ロギングを行う場合は、performメソッド内に新しいLoggerインスタンスを作成して、そのようにする必要があると思います。