35

DelayedJob を使用しようとしていますが、ジョブが失敗し、データベースに次のエラーが表示されます。

{遅延::DeserializationError
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/serialization/active_record.rb:7:in `yaml_new'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/yaml.rb:133:in `transfer'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/yaml.rb:133:in `node_import'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/yaml.rb:133:in `load'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/yaml.rb:133:in `load'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/backend/base.rb:79:in `payload_object'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/backend/base.rb:87:in `invoke_job_without_newrelic_transaction_trace'
(eval):3:in'invoke_job'
/Library/Ruby/Gems/1.8/gems/newrelic_rpm-2.13.4/lib/new_relic/agent/instrumentation/controller_instrumentation.rb:252:in `perform_action_with_newrelic_trace'
/Library/Ruby/Gems/1.8/gems/newrelic_rpm-2.13.4/lib/new_relic/agent/method_tracer.rb:141:in `trace_execution_scoped'
/Library/Ruby/Gems/1.8/gems/newrelic_rpm-2.13.4/lib/new_relic/agent/instrumentation/controller_instrumentation.rb:247:in `perform_action_with_newrelic_trace'
(eval):2:in'invoke_job'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/worker.rb:120:in `run'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/timeout.rb:62:in `timeout'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/worker.rb:120:in `run'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/benchmark.rb:308:in `リアルタイム'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/worker.rb:119: in `run'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/worker.rb:177:in `reserve_and_run_one_job'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/worker.rb:104:in `work_off'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/worker.rb:103:in `times'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/worker.rb:103:in `work_off'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/worker.rb:78:in `start'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/benchmark.rb:308:in `リアルタイム'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/worker.rb:77:in `start'
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/worker.rb:74:「ループ」内
/Library/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/worker.rb:74:in `start'
/ライブラリ/Ruby/Gems/1.8/gems/delayed_job-2.1.3/lib/delayed/tasks.rb:9
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:583:in `invoke'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `トップレベル'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `each'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `トップレベル'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2023:in `トップレベル'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2001:in `run'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run'
/ライブラリ/Ruby/Gems/1.8/gems/rake-0.8.7/bin/rake:31
/usr/bin/rake:19:in `load'
/usr/bin/rake:19

これを診断する際にどこから始めればよいかわかりません。これはこれまでに一度も発生したことがなく、モデルオブジェクトを問題なくシリアル化するために遅延ジョブを使用したことがあります。今回はなぜ?

前もって感謝します!

4

7 に答える 7

69

これは実際には逆シリアル化エラーではなく、単純なModel.find(id)クエリでのActiveRecordレコードが見つからないエラーです。

詳細を知りたい場合は、遅延ジョブが愚かにを上げて有用な情報を捨てるdelayed_job-2.1.3/lib/delayed/serialization/active_record.rb直前に、ファイルのレスキューステートメントにそれらを記録します。DeserializationError

于 2011-02-28T14:32:09.880 に答える
12

マイケルは正しいです。「!ruby/ActiveRecord:YourClassName」のようなオブジェクトのハンドラー フィールドを見てください。

次に、主キーを介してオブジェクトを取得できるかどうかを確認します

コンソールから、次のようにしてこれをテストすることもできます。

# first job in your delayed queue
YAML.load(Delayed::Backend::ActiveRecord::Job.first.handler)
于 2011-03-27T23:11:04.257 に答える
3

AR の逆シリアル化は ID によってレコードをロードするため、未保存または削除された AR オブジェクトに対してジョブを実行すると、これが発生すると思います。保存されていない AR オブジェクトのメソッドを遅延させようとすると、おそらく例外がスローされるはずです。

于 2011-06-24T09:18:55.250 に答える
1

だれかがdelayed_jobをノーオペレーションとしてジョブを終了させたい場合は、イニシャライザで次のコードを使用してモンキーパッチを適用できます。

https://gist.github.com/spiliton/8494752

于 2014-01-18T19:10:25.343 に答える
1

DB のハンドラー フィールドに渡されたパラメーターが標準の TEXT 列よりも長い場合、DJ には文書化されたバグもあります。

https://github.com/collectiveidea/delayed_job/issues/491

これが問題である場合は、列を MEDIUMINT に変更すると問題が解決するはずです。

私は次のように移行でこれを行いました:

change_column :delayed_jobs, :handler, :text, :limit => 16777215
ActiveRecord::Base.connection.execute("DELETE FROM delayed_jobs WHERE LENGTH(handler) >= 65535")

単純な DB クエリの問題かどうかを確認できます。

SELECT * FROM delayed_jobs WHERE LENGTH(handler) >= 65535
于 2013-12-20T17:46:50.140 に答える
0

今日、私もこのエラーに悩まされ、多忙な分析を行った後、次のことがわかりました。

  1. delayed_job はメソッドとパラメータを YAML 形式に変換し、データベースに保存します
  2. select * from delayed_jobs;を使用して見つけることができます。
  3. delayed_job がデシリアライズできない場合、デシリアライズ エラーが発生します。

考えられる原因は次のとおりです。

  1. args["xyz"] は、delayed_job を呼び出す前に使用され、ワー​​カー内で args[:xyz] として使用されます
  2. 時々、追加の引数がオブジェクトと一緒にdelayed_jobに渡され、そのときにdelayed_jobがオブジェクトの構築に失敗することがあります。

これが役立つことを願っています!

于 2011-03-02T19:02:02.293 に答える