2010-11-15 11 views
5

Me gustaría ejecutar una tarea de rake (apn: notificaciones: entregar desde la joya apn_on_rails) desde un trabajo retrasado. En otras palabras, me gustaría poner en cola un trabajo retrasado que llamará a la API: notificaciones: entregar tareas de rake.¿Cómo puedo ejecutar una tarea de rake desde un trabajo retrasado?

Encontré este código http://pastie.org/157390 de http://geminstallthat.wordpress.com/2008/02/25/run-rake-tasks-with-delayedjob-dj/.

que añade este código como DelayedRake.rb a mi directorio lib:

require 'rake' 
require 'fileutils' 

class DelayedRake 
    def initialize(task, options = {}) 
    @task  = task 
    @options = options 
end 

    ## 
    # Called by Delayed::Job. 
    def perform 
    FileUtils.cd RAILS_ROOT 

    @rake = Rake::Application.new 
    Rake.application = @rake 
    ### Load all the Rake Tasks. 
    Dir[ "./lib/tasks/**/*.rake" ].each { |ext| load ext } 
    @options.stringify_keys!.each do |key, value| 
     ENV[key] = value 
    end 
    begin 
     @rake[@task].invoke 
    rescue => e 
     RAILS_DEFAULT_LOGGER.error "[ERROR]: task \"#{@task}\" failed. #{e}" 
    end 
end 
end 

Todo funciona bien hasta que se ejecuta el delayed_job y se queja:

[ERROR]: tareas "APN: notificaciones: entregas " ha fallado. No sé cómo compilar la tarea 'apn: notificaciones: entregar'

¿Cómo puedo informarle sobre apn_on_rails? Intenté requerir 'apn_on_rails_tasks' en la parte superior de DelayedRake, que no hizo nada. También traté de cambiar el directorio de tareas de rake a ./lib/tasks/*.rake

Soy un poco nuevo en Ruby/Rails. Esto se ejecuta en 2.3.5 en heroku.

Respuesta

6

¿Por qué no hacer solo una llamada al sistema?

system "rake apn:notifications:deliver" 
+0

¡Funcionó muy bien! ¿Cómo enviaría @options a la tarea? En este momento estoy llamando: – rmw

+0

sistema "rake # {@ task}" ¿podría hacer el sistema "rake # {@ task} # {@ options}"? – rmw

1

Creo que es más fácil si lo llama como un proceso separado. Ver 5 ways to run commands from Ruby.

def perform 
    `rake -f #{Rails.root.join("Rakefile")} #{@task}` 
end 

Si desea capturar cualquier error, debe capturar STDERR como se muestra en el artículo.

Cuestiones relacionadas