2011-07-27 6 views
9

私は、カスタムジョブクラスでrun_at datetimeを取得しようとしています。私のコードは次のようになります。Delayed_Job:ジョブメタデータへのアクセスや重複ジョブの回避

class MyCustomJob < Struct.new(:my_object) 

    def perform 
    if self.run_at == my_object.start_time 
     # process the job 
    end 
    end 

end 

私もDelayed::Job.find(self)を試みたが、運がなかったです。ジョブを作成する際、事前

+2

行います**実行**メソッド内の**遅延::ジョブ** ARオブジェクトを取得したいですか? – Anatoly

+0

正確に!私はオブジェクトのstart_timeが変更されたかどうか確認する必要があります。 – Oliver

答えて

8

にあなたがこれを処理する必要があり

感謝:あなたの仕事は、予想される時に実行されていない場合は

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?

+0

hm私はすでにこのように私の仕事をキューに入れています。ジョブが実行されたときに、オブジェクトのstart_timeが変更されたかどうかを確認する必要があります。 – Oliver

+0

編集が表示されます。 。 。 – klochner

+0

あなたの返信ありがとう!これはタイミングの問題ではありません..私はカレンダーのイベントを持っていると言うことができます..私は、イベントが開始する前にリマインダを送信したいと思います..そのためのキューの仕事..誰かがイベントを変更翌日..現在のジョブがまだ有効かどうかを確認する必要があります。 – Oliver

10

カスタムジョブのメソッドの前に定義した場合は、労働者が実行する呼び出す前に、あなたに遅れジョブ・インスタンスを渡します:

class MyCustomTask 

    def before(job) 
    @job = job 
    end 

    def perform 
    # has access to @job object. 
    # You may need to call @job.reload to see in-flight changes to object in the database. 
    end 
end 
関連する問題