2010-11-15 79 views
5

Je voudrais exécuter une tâche rake (apn: notifications: délivrer à partir de la gemme apn_on_rails) à partir d'un delayed_job. En d'autres termes, je voudrais mettre en file d'attente un travail retardé qui appellera la tâche apn: notifications: deliver rake. J'ai trouvé ce code http://pastie.org/157390 de http://geminstallthat.wordpress.com/2008/02/25/run-rake-tasks-with-delayedjob-dj/.Comment puis-je exécuter une tâche de rake à partir d'un_delai_job

J'ajouté ce code comme DelayedRake.rb à mon répertoire 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 

Tout fonctionne bien jusqu'à ce que les pistes de delayed_job et il se plaint:

[ERREUR]: tâche « : apn notifications: livrer " échoué. Ne sait pas comment créer une tâche 'apn: notifications: deliver'

Comment le signaler à apn_on_rails? J'avais essayé 'apn_on_rails_tasks' en haut de DelayedRake qui n'a rien fait. J'ai également essayé de changer le répertoire des tâches rake en ./lib/tasks/*.rake

Je suis un peu nouveau sur Ruby/Rails. Cela fonctionne sur 2.3.5 sur heroku.

Répondre

6

Pourquoi ne pas faire seulement un appel système?

system "rake apn:notifications:deliver" 
+0

Ça a bien marché! Comment envoyer des @options à la tâche? En ce moment j'appelle: – rmw

+0

système "rake # {@ task}" pourrais-je faire le système "rake # {@ task} # {@ options}"? – rmw

1

Je crois que c'est plus facile si vous l'appelez comme un processus séparé. Voir 5 ways to run commands from Ruby.

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

Si vous voulez capturer des erreurs, vous devez saisir STDERR comme indiqué dans l'article.