Как я могу запустить задачу грабли из delayed_job - PullRequest
7 голосов
/ 15 ноября 2010

Я бы хотел запустить задачу rake (apn: уведомления: доставить из гема apn_on_rails) из delayed_job.Другими словами, я бы хотел поставить в очередь отложенное задание, которое вызовет задачу apn: notifications: delivery rake.

Я нашел этот код http://pastie.org/157390 из http://geminstallthat.wordpress.com/2008/02/25/run-rake-tasks-with-delayedjob-dj/.

Я добавил этот код как DelayedRake.rb в мой каталог 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

Все работает нормально, пока не запускается delayed_job, и он жалуется:

[ОШИБКА]: задача "apn: уведомления: доставить" не удалось.Не знаю, как создать задачу 'apn: notifications: delivery'

Как мне сообщить ей о apn_on_rails?Я пытался потребовать 'apn_on_rails_tasks' в верхней части DelayedRake, который ничего не делал.Я также попытался изменить каталог задач rake на ./lib/tasks/*.rake

Я немного новичок в Ruby / Rails.Это работает на 2.3.5 на героку.

Ответы [ 2 ]

8 голосов
/ 15 ноября 2010

Почему бы не сделать системный вызов?

system "rake apn:notifications:deliver"
2 голосов
/ 15 ноября 2010

Я считаю, что проще, если вы называете это отдельным процессом.См. 5 способов запуска команд из Ruby .

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

Если вы хотите зафиксировать какие-либо ошибки, вы должны захватить STDERR, как показано в статье.

...