2009-06-13 6 views
1

J'ai actuellement créé un fichier de coupe personnalisé qui effectue les opérations suivantes:(RAILS) Boucler un râteau personnalisé toutes les 2 minutes, mauvaise idée? Une meilleure façon de mettre en œuvre?

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 nouvel enregistrement

3.) Je l'ai actuellement sur une boucle WHILE. La boucle while possède une variable d'instance (@loopcheck) définie initialement sur true et si une exception est déclenchée. Réinitialise à false (donc 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 de fond pour vérifier simplement un nouveau flux toutes les 2-3 minutes. J'ai regardé dans Starling/Workling, mais cela semblait un peu exagéré, et je n'étais pas sûr de l'exécution de script/runner via CRON, car il recharge chaque fois l'intégralité de l'environnement des rails. BackgroundRB un peu exagéré aussi? Non?

Je voulais juste avoir quelques idées.

Répondre

2

Combinez cron avec le sommeil. Cela assurera que les choses ne se décomposent pas complètement si vous frappez une exception. Chargement "complète rails environnement" n'est pas si mauvais: 3-6 secs pire cas. alors lancez votre boucle de sommeil 5 fois. et cron la tâche de rake pour courir toutes les 12 minutes. Logique?

*/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 
+0

Hm, Clever! par "Exécutez votre boucle de sommeil 5 fois" voulez-vous dire comme 5 fois faire (@loopcheck) .... fin Et puis faire une pause pendant 1 min entre chaque boucle encore? (Donc 5 minutes par boucle) –

+0

Je vais mettre à jour la solution avec du code pour la boucle. Commentaires inutiles pour l'envoi d'extraits de code. –

+0

Excellent, va essayer. Merci pour la perspicacité! –

2

Vérifiez cette Railscast récente « Chaque fois que »

le lien est ici et les commentaires discuter des alternatives

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

+0

Heh, j'utilise actuellement Whenever, une excellente ressource. Je pourrais essayer rufus_scheduler car cela pourrait aussi être utile. –

0

Cette chose la plus simple qui pourrait éventuellement travailler, supposant que vous êtes sur une boîte Unix, est d'exécuter le script une fois toutes les deux minutes de cron, sans la boucle/sommeil. Cela vous évite d'avoir à surveiller et redémarrer votre script en cas d'échec. Et si cela échoue, cron vous enverra un email. L'inconvénient de cette approche, comme vous l'avez noté, est que toutes les deux minutes, vous prenez un coup pour démarrer un processus Ruby. Est-ce important? Vous seul pouvez dire. J'ai plusieurs scripts comme celui-ci sur une boîte légèrement chargée, et j'oublie qu'ils sont encore là.

Questions connexes