4

ActiveJob を作成し、実行ブロックが ActiveRecord オブジェクトの単一インスタンスであると予想される引数を受け入れる場合、ジョブがキューに入れられると問題のオブジェクトが存在しますが、実際の実行時にはそのオブジェクトは存在しなくなります。 、仕事は明らかに失敗しますよね?

MyJob < ActiveJob::Base
  def perform(widget)
    # do some stuff to widget
  end
end

したがって、ActiveJob が元の ActiveRecord オブジェクトをインスタンス化できないために失敗したこのジョブは、失敗し続けます。失敗のループを止めるために、ジョブに対してどのような更新を行うことができますか。へのフックを検討しましbefore_performたが、まだ道が見えていません。

当面の問題を解決する以外に、私がここで学んだもう 1 つのことはwidget_id、ActiveRecord オブジェクトではなく整数を渡す方がよいということです。その後、実行ブロック内から問題のウィジェットがまだ存在するかどうかを確認できたはずです。

4

1 に答える 1

4

オブジェクトが見つからなくなったときにスローされることができrescue_fromます。ActiveJob::DeserializationError注: この逆シリアル化は、実行コールバックが開始される前に発生するため、実行コールバックを使用して状況を処理できます。

したがって、ジョブクラスに次を追加できます。

class MyJob < ActiveJob::Base

  rescue_from(ActiveJob::DeserializationError) do |exception|
    # return true (we rescued) if the error causing the deserialization
    # error was a record not being found
    exception.original_exception == ActiveRecord::RecordNotFound
  end
end

rescue_from返された場合はtrue、エラーが処理され、ジョブが正常に完了したことを示します。この場合、デシリアライゼーション エラーの原因となったエラーがActiveRecord::RecordNotFound( ActiveJob が ActiveRecord オブジェクトをシリアライズおよびデシリアライズするために使用するglobalidgemがオブジェクトを見つけられない場合に発生するもの) であるかどうかを確認しました。

于 2015-08-10T19:59:01.193 に答える