(RAILS) Looping une coutume Rake toutes les 2 minutes, mauvaise idée? Une meilleure façon de mettre en œuvre?

StackOverflow https://stackoverflow.com/questions/991795

Question

Je suis actuellement créé un fichier de coupe personnalisé qui effectue les opérations suivantes:

1.) Vérifie un flux externe des articles "NOUVEAU"

2.) Pour chaque nouveau élément du tableau d'alimentation, il met à jour ma base de données avec un nouveau record

3.) Je l'ai eu ce moment sur une boucle while. La boucle while a un (@loopcheck) variable d'instance qui est initialement réglé sur vrai, et si une exception est soulevée. Réinitialise à faux (de sorte que la boucle se termine).

Voici un exemple:

   While(@loopcheck) do 
      begin
       ....(code here)...
      rescue
        Exception => e
        @loopcheck = false
      end
      sleep(120)
   End

Est-ce mauvais codage? Y a-t-il une meilleure manière de faire cela? Idéalement, je veux juste exécuter une tâche d'arrière-plan pour vérifier simplement un nouveau flux tous les 2-3 minutes. Je regardais dans Starling / Workling, mais qui semblait un peu exagéré, et je ne suis pas sûr de script / coureur en cours d'exécution via CRON, car il recharge tout l'environnement des rails à chaque fois. BackgroundRB un peu exagéré aussi? Non?

Je voulais juste obtenir quelques idées.

Était-ce utile?

La solution

Combiner Cron avec le sommeil. Elle veillera à ce que les choses ne sont pas complètement briser vers le bas si vous frappez une exception. Chargement « environnement rails complets » est pas si mal: 3-6 secondes pire des cas. donc exécuter votre boucle de sommeil 5 fois. et la tâche cron de râteau pour exécuter toutes les 12 minutes. Sens?

*/12 * * * * rake your task

## your rake task - valid for 10 mins -- 5 x 2 mins sleep worth.

@loopcheck = true

1.upto(5) do 
    begin
       ....(code here)...
    rescue
      Exception => e
      @loopcheck = false
    end
    break if not @loopcheck
    sleep(120)
end

Autres conseils

Découvrez cette Railscast récente sur "Chaque fois que"

le lien est ici et les commentaires discuter des alternatives

http://railscasts.com/episodes/164-cron-in-ruby

Cette chose la plus simple qui pourrait éventuellement travailler, supposant que vous êtes sur un système Unix, est d'exécuter le script une fois toutes les deux minutes de Cron, sans la boucle / sommeil. Cela vous permet d'éviter d'avoir à surveiller et redémarrer votre script si elle échoue. Et si elle ne manque, vous Cron envoyer un email.

L'inconvénient de cette approche, comme vous l'avez dit, est que toutes les deux minutes, vous prenez un coup pour le démarrage d'un processus Ruby. Est-ce important? Seulement vous pouvez dire. J'ai plusieurs scripts comme celui-ci sur une boîte légèrement chargé, et d'oublier qu'ils sont encore là.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top