2010-02-23 5 views
1

J'ai un contrôleur qui génère des rapports HTML, XML et CSV. Les requêtes utilisées pour ces rapports prennent plus d'une minute pour renvoyer leur résultat.Tâches longues exécutées dans Rails

Quelle est la meilleure approche pour exécuter ces tâches en arrière-plan, puis renvoyer le résultat à l'utilisateur? J'ai regardé Backgroundrb. Y a-t-il quelque chose de plus basique pour mes besoins?

Répondre

5

Vous pouvez utiliser DelayedJob pour effectuer ces requêtes et disposer d'une table supplémentaire appelée "NotificationQueue". Lorsqu'un travail est terminé (avec son jeu de résultats), stockez le jeu de résultats et l'ID utilisateur de la personne qui a effectué cette requête dans la table NotificationQueue. Ensuite, à chaque chargement de page (et, si vous le souhaitez, toutes les 15-20 secondes), interrogez cette base de données et vérifiez s'il existe des requêtes terminées.

DelayedJob est vraiment génial parce que vous écrivez votre code comme si elle n'a pas été va être un emploi retardé, et il suffit de changer le code pour effectuer les opérations suivantes:

#Your method 
Query.do_something(params) 

#Change to 
Query.send_later(:do_something, params) 

Nous utilisons tous les temps au travail, et cela fonctionne très bien.

+0

J'adore * ce design. –

+0

DelayedJob semble prometteur, mais comment stockez-vous le jeu de résultats lorsque vous utilisez ActiveRecord? – Trevor

+0

DelayedJob exécute essentiellement une copie de votre application. Il a accès à votre base de données, donc quand vous appelez le travail retardé, il dit: «Ok, exécutez ce morceau de code, avec ces données». Il va enregistrer dans la base de données, tout comme une fonction régulière. –

Questions connexes