2010-07-15 5 views
3

Je dois mettre à jour un modèle après delayed_job traite une tâche sur elle, par exemple:Callback après le processus de delayed_job travail

foo.delay.something

Après something est fait, je dois mettre à jour l'objet foo, quel est le meilleur moyen d'y parvenir? Je pensais coder un rappel sur la classe Delayed::Backend::ActiveRecord::Job, mais il devrait y avoir quelque chose de plus propre et de mieux à faire.

Répondre

3

Je voudrais juste mis à jour à la fin de la méthode #foo:

def foo 
    # do work here 
    update_attribute :processed, true 
end 
1

Je ne comprends pas pourquoi vous ne le feriez pas dans le cadre du travail qui agit déjà sur l'objet.

+0

Oui je pourrais 'delay' l'ensemble du flux, mais je voudrais savoir comment déclencher un' after_processed' rappel. – jpemberthy

+0

J'ai une situation similaire, mais dans mon cas, cela fonctionne juste pour mettre en file d'attente un autre travail à la fin de la première. En outre, il est important de noter que les tâches créées sont des objets ActiveRecord eux-mêmes, donc si vous souhaitez y ajouter des rappels de cycle de vie, vous pouvez le faire. –

+0

Hey merci, personnellement, pour ce cas précis, j'aime plus l'idée d'ajouter des rappels aux instances Job plutôt que de mettre en file d'attente un job après l'autre, donc, je vais le callback sur les instances Job :) – jpemberthy

0

mettre à jour un dossier comme suggéré est très bien, mais il est seulement une partie de la solution ...

un rappel serait aider si je veux plus de contrôle sur ce qu'il faut faire en cas d'échec .. à savoir:

Delayed::Job.enqueue InstructionRequestJob.new(p1, p2) 

InstructionRequestJob perform 
- perform a task on a remote server 
- get a response 
- case response 
    when OK 
    update attribute (as suggested) 
    else 
    # how many attempts ? 
    if too_many_attempts 
     update attribute 
     destroy the job 
    else 
     reschedule the job for another attempt 
- end 
Questions connexes