にあなたがこれを処理する必要があり
感謝:あなたの仕事は、予想される時に実行されていない場合は
priority = 0
run_time = my_object.start_time
Delayed::Job.enqueue(MyCustomJob.new(my_object), priority, run_time)
https://github.com/tobi/delayed_job/wiki
、あなたはUTCのためにそれらをスケジュールすることができます:
http://www.gregbenedict.com/2009/08/19/is-delayed-job-run_at-datetime-giving-you-fits/
既存のjについてのキューを確認するにはOB - あなたが次のことを行うことができます:
class MyCustomJob < Struct.new(:object_id)
def self.exists?(object_id)
Delayed::Job.where(['handler = ? and failed_at is null',handler(object_id)]).count(:all) > 0
end
def self.handler(object_id)
"--- !ruby/struct:MyCustomJob \nobject_id: #{object_id}\n"
end
def perform
my_object = MyObject.find(object_id)
my_object.do_stuff
end
end
それからちょうどキューに入れる前にMyCustomJob.exists?(my_object.id)
を確認してください。
これは少しハックです - 必要に応じてhandler
メソッドを編集してください。私は、あなたのジョブテーブルが大きい場合や、他のタイプのジョブでこれを行う場合、より洗練されたコードとより効率的なテーブルスキャンを行うためのクラス/ object_idを持つようにdelayed_jobsテーブルを変更します。
この質問は、関連になります。
How to cancel scheduled job with delayed_job in Rails?
行います**実行**メソッド内の**遅延::ジョブ** ARオブジェクトを取得したいですか? – Anatoly
正確に!私はオブジェクトのstart_timeが変更されたかどうか確認する必要があります。 – Oliver