2009-10-22 5 views
1

J'utilise le plugin delayed_job dans Rails pour faire du traitement en arrière-plan, et je suis confronté à un hoquet dans le 'développement agile' que j'ai connu jusqu'ici dans Rails ...Rails/delayed_job - Je veux charger la dernière version de la classe d'emplois

Habituellement dans les rails si j'atteins une erreur/je souhaite ajouter une nouvelle fonctionnalité - j'ajoute juste du code et actualise la page et le nouveau code s'exécute. Avec delayed_job, il semble que la classe job ne soit pas rechargée ... si un job échoue et que je corrige l'erreur et redémarre le job, l'ancien code s'exécute à nouveau.

Est-il possible de faire en sorte que delayed_job charge la dernière version de la classe de travail avant de l'appeler?

Juste au cas où cela n'a rien à voir avec elle - je sais que delayed_job a quelques options différentes façons de déclarer les emplois/exécuter des travaux:

Ma classe d'emploi est dans le répertoire lib de Rails et est déclarée comme:

class FooJob < Struct.new(:foo_id) 

et j'invoquer le travail comme celui-ci du contrôleur:

Delayed::Job.enqueue(FooJob.new(params[:id])) 

Répondre

1

Il n'y a rien à faire builtin. En général, vous êtes responsable de la gestion et du rechargement de vos travailleurs. C'est probablement aussi bien puisque le rechargement du développement de Rails est bon mais pas parfait, et essayer de recharger automatiquement un job retardé risque de rencontrer toutes sortes de problèmes subtils qui seraient assez opaques pour déboguer dans un processus de travail. En outre, s'il rechargeait automatiquement l'environnement pour chaque travail, beaucoup de cas d'utilisation deviendraient extrêmement lents en mode de développement. Ma suggestion est juste pour faire usage de faire rake jobs:work puis Ctrl-C lorsque vous apportez des modifications. Sinon, vous pouvez créer un script qui vient exécute manuellement les emplois sur une base ad-hoc (prise de delayed_job docs):

#!/usr/bin/env ruby 
require File.dirname(__FILE__) + '/../config/environment' 

Delayed::Worker.new.start 
+1

Une autre bonne solution peut être trouvée [ici] (http://stackoverflow.com/a/4905363/250703) – Christian

0

J'utilise ce hack que les coutures pour travailler assez agréable, mais sachez que c'est probablement très Rails et la version de delayed_job spécifique, donc vous devrez probablement changer certaines choses. Testé avec Rails 3.2.0 et delayed_job 2.1.4.

Mettez ceci dans par ex. script/delayed_job_development et exécutez-le à partir de la racine Rails.

#!/usr/bin/env ruby 

require File.expand_path('../config/environment', File.dirname(__FILE__)) 
require 'delayed/worker' 
require "rails/console/app" 

class DummyConsoleClass 
    include Rails::ConsoleMethods 
end 
dummy_console = DummyConsoleClass.new 

worker = Delayed::Worker.new({:quiet => false}) 

puts "Waiting for jobs..." 
loop do 
    if Delayed::Job.find_available(worker.name).count > 0 
    puts "Found jobs" 
    dummy_console.reload! 
    loop do 
     break if worker.work_off.sum == 0 
    end 
    puts "Done, waiting for jobs..." 
    end 
    sleep(2) 
end 

S'il vous plaît commentaire si vous savez que cela est une très mauvaise idée ou des choses à connaître, je l'utilise surtout quand l'édition et l'emploi test qui fonctionnent immédiatement pas avec les tâches planifiées à long terme, dans l'avenir.

Questions connexes