2011-07-27 9 views
9

Próbuję uzyskać datetime run_at w niestandardowej klasie zadania. mój kod wygląda następująco:Delayed_Job: uzyskiwanie dostępu do metadanych zadania i/lub unikanie duplikowania zadań

class MyCustomJob < Struct.new(:my_object) 

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

end 

i również spróbował Delayed::Job.find(self) ale nie miał szczęścia.

góry dzięki

+2

zrobić chcesz uzyskać obiekt ** Opóźniony :: Praca ** AR wewnątrz metody ** perform **? – Anatoly

+0

dokładnie! muszę sprawdzić, czy zmieniono parametr start_time obiektu. – Oliver

Odpowiedz

8

Należy się tym zająć podczas tworzenia zadania:

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

Jeśli zadania nie są wyświetlane w spodziewanym czasie, może być szeregowania je do UTC :

http://www.gregbenedict.com/2009/08/19/is-delayed-job-run_at-datetime-giving-you-fits/

Aby sprawdzić kolejkę do istniejącego j ob - można wykonać następujące czynności:


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 

Następnie wystarczy sprawdzić MyCustomJob.exists?(my_object.id) przed kolejkach.

To trochę hack - w razie potrzeby edytuj metodę handler. Zmodyfikuję tabelę delayed_jobs tak, aby miała ona właściwość class/id_obiektu, aby uzyskać czystszy kod i bardziej wydajne skanowanie tabeli, jeśli twoja tabela zadań jest duża lub jeśli robisz to z innymi typami zadań.

ta kwestia wygląda również istotne:

How to cancel scheduled job with delayed_job in Rails?

+0

hm już w kolejce mojej pracy w ten sposób. Muszę sprawdzić, czy start_time zmienił się na obiekcie podczas pracy zadania. – Oliver

+0

zobacz zmiany. . . – klochner

+0

dzięki za odpowiedź! to nie jest problem z taktowaniem .. powiedzmy, że mam wydarzenie w kalendarzu .. chciałbym wysłać przypomnienie 10 minut przed rozpoczęciem zdarzenia .. więc tam jest zadanie w kolejce do tego ... ktoś zmienia wydarzenie do Następnego dnia .. więc muszę sprawdzić, czy aktualne zadanie jest nadal aktualne. – Oliver

10

Jeśli zdefiniować przed metody na niestandardowej pracy, pracownik przejdzie ci opóźnione wystąpienie pracy przed wywołaniem wykonać:

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