2015-05-01 7 views
7

Ich habe eine Methode, die ich asynchronKann ich delayed_job mit max. Versuchen von 1 aufrufen?

User.delay(queue: 'users').grab_third_party_info(user.id) 

Im Fall laufe dies fehlschlägt, ich will es nicht erneut zu versuchen. Meine Standardwiederholungen sind 3, die ich nicht ändern kann. Ich möchte das nur einmal ausprobieren. Folgendes scheint nicht zu funktionieren:

User.delay(queue: 'users', attempts: 3).grab_third_party_info(user.id) 

Irgendwelche Ideen?

+1

Bekommen Sie die Antwort? – pramod

Antwort

1

Von https://github.com/collectiveidea/delayed_job#custom-jobs

einem Pro-Job max Versuchen festgelegt, dass die verzögerte überschreibt :: Worker.max_attempts Sie Sie

NewsletterJob = Struct.new(:text, :emails) do 
    def perform 
    emails.each { |e| NewsletterMailer.deliver_text_to_email(text, e) } 
    end 

    def max_attempts 
    3 
    end 
end 

Ist diese Hilfe eine max_attempts Methode auf den Job definieren können?

+2

Nein, weil Sie dies für einen von Ihnen erstellten Job tun müssen. Ich spreche davon, es nur mit der Verzögerungsmethode zu nennen .... – Jeff

2

Dies ist nicht meine favorisierte Lösung, aber wenn Sie benötigen die Verzögerung Methode verwenden, die Sie die Versuche einstellen: auf eine weniger Ihre max Versuche. Also in Ihrem Fall sollte die folgende Arbeit

User.delay(queue: 'users', attempts: 2).grab_third_party_info(user.id) 

Noch besser wäre es Sie könnte es sicherer machen, indem Verzögerte mit :: Worker.max_attempts

User.delay(queue: 'users', attempts: Delayed::Worker.max_attempts-1).grab_third_party_info(user.id) 

Dies würde es in Ihrem delayed_jobs Tabelle eintragen, als ob es bereits lief zweimal, wenn es wieder läuft, wird es bei den maximalen Versuchen sein.

+0

hackish, aber, funktioniert ... –