2010-11-15 303 views
5

我想從delayed_job運行rake任務(apn:notifications:從apn_on_rails gem提供)。換句話說,我想入隊一個延遲的工作,它會調用apn:notifications:傳遞rake任務。我如何從delayed_job運行rake任務

我發現這個代碼http://pastie.org/157390http://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:deliver'

如何讓它知道apn_on_rails?我曾嘗試在DelayedRake的頂部請求'apn_on_rails_tasks',它沒有做任何事情。我也嘗試將rake任務的目錄更改爲./lib/tasks/*.rake

我對Ruby/Rails有點新鮮。這在heroku上運行在2.3.5上。

回答

6

爲什麼不做一個系統調用?

system "rake apn:notifications:deliver" 
+0

這很棒!我將如何發送@options到任務?現在我打電話: – rmw 2010-11-15 16:34:24

+0

系統「耙#{@任務}」我可以做系統「耙#{@任務}#{@選項}」? – rmw 2010-11-15 16:34:59

1

我相信如果你把它作爲一個單獨的過程來調用它會更容易。見5 ways to run commands from Ruby

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

如果你想捕捉任何錯誤,如在文章中,你應該捕獲STDERR