【问题标题】:How can I run a rake task from a delayed_job如何从 delay_job 运行 rake 任务
【发布时间】:2011-05-10 03:50:06
【问题描述】:

我想从 delay_job 运行 rake 任务(apn:notifications:deliver 来自 apn_on_rails gem)。换句话说,我想排队一个延迟的作业,它会调用 apn:notifications:deliver rake 任务。

我从http://geminstallthat.wordpress.com/2008/02/25/run-rake-tasks-with-delayedjob-dj/ 找到了这个代码http://pastie.org/157390

我将此代码作为 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

在延迟作业运行并抱怨之前一切都运行良好:

[错误]:任务“apn:notifications:deliver”失败。不知道如何构建任务 'apn:notifications:deliver'

如何让它知道 apn_on_rails?我尝试过在 DelayedRake 顶部的 require 'apn_on_rails_tasks' 没有做任何事情。我还尝试将 rake 任务的目录更改为 ./lib/tasks/*.rake

我对 Ruby/Rails 有点陌生。这是在 heroku 上的 2.3.5 上运行的。

【问题讨论】:

    标签: ruby-on-rails rake delayed-job


    【解决方案1】:

    为什么不只做一个系统调用?

    system "rake apn:notifications:deliver"
    

    【讨论】:

    • 效果很好!我如何将@options 发送到任务?现在我正在打电话:
    • system "rake #{@task}" 我可以做 system "rake #{@task} #{@options}" 吗?
    【解决方案2】:

    我相信如果你把它作为一个单独的过程来调用会更容易。见5 ways to run commands from Ruby

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

    如果你想捕获任何错误,你应该捕获STDERR,如文章所示。

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 2010-09-23
      • 2012-11-15
      • 1970-01-01
      • 2019-05-31
      • 2012-05-30
      • 2014-12-05
      • 2011-08-04
      • 2011-06-17
      相关资源
      最近更新 更多