出于开发目的,让我的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
答案 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应用程序。