tuto – rails – scheduled task

Il existe toutes sortes de gem pour paramétrer et planifier des tâches dans une application rails. Cela vous permet de déclencher pour une action donnée toutes une série de planification. Je vais détailler ici le fonctionnement de l’outil delayed_job (étant donné que je n’ai utilisé que celui-là pour le moment dans mes devs). Pour rentrer dans la technique, lorsque vous bouclez sur une action, vous allez créer autant d’instance SQL que nécessaire. Celles-ci vont rester en base temporairement. Parallèlement à celà, la cron_job va vérifier qu’il y a des instances à traiter pour l’instant présent. Ces instances peuvent être priorisés (la priorité s’écrit directement dans les méthodes appelées). Une fois le job traité, il disparait de la base sql. Simple non ?

 

 

Les lignes à rajouter dans votre gemfile, sans oublier le bundle install. Le gem daemons est nécessaire pour pouvoir exécuter les tâches en background indépendamment de ce qui se passe dans l’application :

gem 'delayed_job_active_record'
gem "daemons"

 

 

Il faut ensuite créer le modèle pour delayed_job et l’installer en base :

rails generate delayed_job:active_record
rake db:migrate

 

 

Dans votre modèle, voici comment se présente l’appel d’une méthode avec delayed_job sur un objet :

instance.delay.methode(param1,param2,param_n)

 

 

Définir dans la méthode la priorité et le timing pour l’exécution :

    def method_name(parameters)
        ....
        ....
    end
    handle_asynchronously :method_name,  :run_at => Proc.new { X.minutes.from_now }, :priority => Y

 

 

Enfin, assurez-vous que le delayed_job manager est bien lancé (quitte à le stopper avant de le relancer) :

delayed_job start
delayed_job stop

 

 

Si vous souhaitez pendant vos tests supprimer tous les jobs restant à traiter :

rake jobs:clear

 

 

Voici un thread de stackoverflow comparant les différentes options qui s’offrent à vous en matière de planification de tâches dans une application rails. On peut voir que delayed_job n’est pas le plus rapide quand il s’agit d’exécution de tâches, mais concernant sa mise en oeuvre, il est assez simple d’utilisation. En bonus, la page github du gem delayed_job.