2010-11-15 13 views
5

Mi piacerebbe eseguire un'attività rake (apn: notifiche: consegna dalla gemma apn_on_rails) da un delayed_job. In altre parole, mi piacerebbe accodare un lavoro in ritardo che chiamerà l'apn: notifications: deliver rake task.Come posso eseguire un'attività di rake da un delayed_job

Ho trovato questo codice http://pastie.org/157390 da http://geminstallthat.wordpress.com/2008/02/25/run-rake-tasks-with-delayedjob-dj/.

ho aggiunto questo codice come DelayedRake.rb alla mia cartella 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 

Tutto funziona bene fino a quando le piste delayed_job e si lamenta:

[ERRORE]: attività "APN: notifiche: consegnare "fallito. Non so come creare task "apn: notifications: deliver"

Come faccio a sapere di apn_on_rails? Avevo provato richiedere 'apn_on_rails_tasks' in cima alla DelayedRake che non hanno fatto nulla. Ho anche provato a cambiare la directory delle attività di rake in ./lib/tasks/*.rake

Sono un po 'nuovo a Ruby/Rails. Questo è in esecuzione su 2.3.5 su heroku.

risposta

6

Perché non si limitano a una chiamata di sistema?

system "rake apn:notifications:deliver" 
+0

Che ha lavorato grande! Come posso inviare @options all'attività? In questo momento sto chiamando: – rmw

+0

sistema "rastrello # {@ compito}" potevo fare sistema "rastrello # @ {task} # {@} opzioni"? – rmw

1

Credo sia più semplice se lo si chiama come un processo separato. Vedi 5 ways to run commands from Ruby.

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

Se si desidera catturare eventuali errori, si devono acquisire STDERR come indicato in questo articolo.

Problemi correlati