2015-05-01 14 views
7

Ho un metodo che ho eseguito in modo asincronoPosso chiamare delayed_job con max tentativi di 1?

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

In caso di esito negativo, voglio che si riconnette. I miei tentativi di default sono 3, che non posso cambiare. Voglio solo provarlo solo una volta. Sembra non funzionare:

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

Qualche idea?

+1

Hai ricevuto la risposta? – pramod

risposta

1

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

per impostare un lavoro per-max tentativi che sostituisce la ritardata :: Worker.max_attempts è possibile definire un metodo di MAX_ATTEMPTS sul lavoro

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 

Fa questo aiuto?

+2

No perché è necessario farlo su un lavoro che si crea. Sto parlando solo di chiamarlo con il metodo delay .... – Jeff

2

Questa non è la mia soluzione preferita, ma se è necessario utilizzare il metodo di ritardo che è possibile impostare i tentativi: a uno in meno i tentativi max. Quindi nel tuo caso il seguente dovrebbe funzionare

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

Meglio ancora si potrebbe rendere più sicuro utilizzando ritardati :: Worker.max_attempts

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

Ciò entrare nella tua tabella di delayed_jobs come se già correva due volte così quando corre di nuovo sarà al massimo dei tentativi.

+0

hackish, ma, funziona ... –

Problemi correlati