1

Rails 3.2.12でdelayed_job 3.0.5 (delayed_job_active_record 0.4.1)を実行しています。「デシリアライゼーション」が原因でジョブの一部が失敗するという問題があります。以下は、失敗したハンドラーの 1 つの非常に単純な例です。

--- !ruby/struct:Delayed::PerformableMethod
object: LOAD;Project;924951
method: :send_project_open_close_without_delay
args: []

このジョブを呼び出そうとすると:

Delayed::DeserializationError: Job failed to load: undefined method `members' for nil:NilClass.

これは、もはや存在しない AR オブジェクトが原因だと誰もが考えているようです。私の場合、ハンドラーを問題なく実行できます。

Project.find(924951).send_open_close_without_delay

他に何がエラーを引き起こしている可能性がありますか?

4

3 に答える 3

0

誰かがこの問題に遭遇した場合に備えて。原因は、一部のジョブに古いバージョンの Delayed Job が挿入されたことが原因であることがわかりました。そのため、新しい遅延ジョブがそれらを処理しようとしたときに、ハンドラーを逆シリアル化できませんでした。

于 2013-04-11T12:53:30.907 に答える
0

Delayed::Jobこれは、シリアル化ハンドラが変更され、 に使用されるオブジェクトのタイプが変更された へのアップグレードが原因でしたPerformableMethod。すべての古いジョブを修正し、Delayed::Job の新しいデフォルトを使い続けたい場合は、次のクエリで失敗したものを修正できます。

Delayed::Job.where('failed_at is not null').each do |dj|
  dj.handler = dj.handler.gsub('struct:Delayed', 'object:Delayed')
  Delayed::Worker.new.run(dj)
end

このあたりで変更が発生しました: https://github.com/collectiveidea/delayed_job/commit/7b8a79a72c0ee5d8bac4bc0b183d1cce9cedff85

PerformableMethodの代わりにクラスを作成しStructます。

于 2016-04-08T17:40:30.267 に答える