2011-05-22 16 views
5

Estoy usando Resque con Redis para procesar un trabajo en segundo plano. Me gustaría llamar al método, Resque.enqueue (MiModelo) una vez cada hora para hacer una tarea en segundo plano.¿Cómo se llama un método cada hora en Rails?

Por ejemplo: Supongamos que tengo un sitio que tiene 10.000 usuarios. Me gustaría llamar a este método solo 24 veces por día; no 10,000 * 24. El método de ejemplo es el siguiente:

Resque.enqueue(MyModel) 

Gracias por su ayuda con anticipación. También debo mencionar que prefiero seguir con Resque, y no pasar a Retraso en el trabajo. Gracias.

+0

bucle infinito, primero llame al método y luego espere 3600 segundos? –

+0

¿Cómo te atreves :) hay herramientas dedicadas para esto! – apneadiving

+0

@apneadiving tbh, en un caso simple como este (especialmente donde necesita acceder a un objeto), sería tan probable que haga eso como lo haría para configurar un trabajo cron. –

Respuesta

5

Debe utilizar un trabajo cron para este tipo de tarea.

Le sugiero que utilice la gema Whenever.

Ver Railscast aquí: http://railscasts.com/episodes/164-cron-in-ruby

+0

Estoy viendo el railscast # 164 y la gema Whenever se ve bien. ¿Tienes mucha experiencia con esta joya? ¿Alguna negativa que deba considerar? –

+0

No, es genial y te permite programar lo que necesites con una periodicidad adecuada – apneadiving

+0

Los trabajos de cron no son específicos de los rieles. Se usan para mantenimiento, etc. ... – apneadiving

3

Dado que ya está utilizando Resque, recomendaría usar uno de los muchos plugins disponibles Resque: resque-scheduler. Se conecta muy bien a la interfaz de usuario de Resque. Configuración simple como se explica en el archivo README. También agrega muchas cosas faltantes de DelayedJob (ejecución retrasada).

¿Por qué cambiaron whenever-resque-scheduler:

  • permanece en el App-carpeta y no se mete con su archivo cron.
  • Para detener a todos los 'crons' simplemente deshabilite los trabajadores de Resque.
  • Las excepciones se registran en la IU de Resque.
  • Es posible la reprogramación manual a través de la IU de Resque.
  • En combinación con resque-loner, impide la doble ejecución en caso de que un trabajo tarde más que el intervalo entre dos ejecuciones.
  • Sigue obedeciendo al sistema de prioridad de Resque.
  • Sin tiempo de arranque adicional (podría tomar hasta 60 segundos si la aplicación aumenta) ya que utiliza el grupo de trabajadores de Resque.
  • Se usa una menos "tecnología".
  • Interruptor simple: la configuración se realiza de forma cron.
+0

+1 porque parece que esto no implicaría el tiempo de inicio del entorno de ejecutar una prueba de rake cada 5 minutos, etc. Eso es una gran victoria para nosotros, ya que tenemos muchas tareas en segundo plano. – d11wtq

0

puede usar fácilmente Whenever que hace exactamente lo que pide y mucho más, tiene una documentación bastante buena.

puede utilizar una sintaxis como esta:

every 3.hours do 
    runner "MyModel.some_process" 
    rake "my:rake:task" 
    command "/usr/bin/my_great_command" 
end 

instalarlo usando:

$ gem install whenever 

o añadirlo a su Gemfile:

gem 'whenever', :require => false 

continuación, ejecute:

$ cd /apps/my-great-project 
$ wheneverize . 

Espero que esto te ayude!

Cuestiones relacionadas