在rails应用程序中启动救援任务

时间:2014-01-29 17:18:57

标签: ruby-on-rails ruby resque

出于开发目的,让我的resque工作人员使用我的Rails应用程序启动/停止是非常方便的,但我找到的每个示例都显示了如何使用rake任务运行worker。

所以,这就是我到目前为止所做的,而且我已经看到作业被取消并成功处理。但这是一个完全不知情的尝试。这种方法有任何缺陷,还是可以做得更好?但是,我遇到了一个与ActiveRecord相关的严重问题。我很确定ralis应用程序和工作者有时都使用相同的activerecord连接。我需要明白这一点。

我撕掉了resques'工作人员任务代码的内容,并把它放在我的config / initializer / resque.rb中,如下所示。如果没有设置,我确实需要预先填充QUEUES env变量,这样开发人员就不必使用我们的rails应用程序输入那么多。

Resque.redis = Rails.application.config.redis_host


if !$rails_rake_task && Rails.env == 'development'

  # pre-populate QUEUES env var with '*' if not set
  ENV['QUEUES'] ||= '*'

  Thread.new do
    # from: https://github.com/resque/resque/blob/1-x-stable/lib/resque/tasks.rb
    queues = (ENV['QUEUES'] || ENV['QUEUE']).to_s.split(',')

    begin
      worker = Resque::Worker.new(*queues)
      if ENV['LOGGING'] || ENV['VERBOSE']
        worker.verbose = ENV['LOGGING'] || ENV['VERBOSE']
      end
      if ENV['VVERBOSE']
        worker.very_verbose = ENV['VVERBOSE']
      end
      worker.term_timeout = ENV['RESQUE_TERM_TIMEOUT'] || 4.0
      worker.term_child = ENV['TERM_CHILD']
      worker.run_at_exit_hooks = ENV['RUN_AT_EXIT_HOOKS']
    rescue Resque::NoQueueError
      abort "set QUEUE env var, e.g. $ QUEUE=critical,high rake resque:work"
    end

    if ENV['BACKGROUND']
      unless Process.respond_to?('daemon')
        abort "env var BACKGROUND is set, which requires ruby >= 1.9"
      end
      Process.daemon(true, true)
    end

    if ENV['PIDFILE']
      File.open(ENV['PIDFILE'], 'w') { |f| f << worker.pid }
    end

    worker.log "Starting worker #{worker}"

    worker.work(ENV['INTERVAL'] || 5) # interval, will block
  end
end

3 个答案:

答案 0 :(得分:2)

我通过在Raquefile

中添加一个环境变量来解决这个问题
require 'resque/tasks'

task "resque:setup" do
  ENV['QUEUE'] = '*'
end

答案 1 :(得分:0)

到目前为止,我提出的最好的方法似乎没有问题是在线程中使用system()运行rake任务。我只是希望避免创建一个全新的过程。

Resque.redis = Rails.application.config.redis_host

if !$rails_rake_task && Rails.env == 'development'

  Thread.new do
    system("QUEUE='*'bundle exec rake environment resque:work")
  end
end

答案 2 :(得分:0)

我认为你想要做的是在development.rb文件中设置Resque.inline = true。一般来说这是一个坏主意 - 但如果您正在尝试调试Resque作业,或者围绕它们运行测试,那么它可能是一个有用的设置。基本上,它将在与Rails应用程序相同的进程中运行Resque,在作业运行时暂停Rails应用程序。