我在delayed_job 中使用命名队列来保持任务被服务器隔离:
subdomain = Socket.gethostname.split('.')[0]
MyModel.delay(:queue => (subdomain + "_queue")).get_some_records
当我在每台服务器上启动延迟作业时,我需要设置--queue
标志。可以将参数传递给 delay_job CL set :delayed_job_args
。AFAIK,Capistrano 允许使用$CAPISTRANO:HOST$
inrun
命令,但这对我没有帮助set
。
作为一种解决方法,我已经像这样覆盖了delayed_jobs 任务:
desc "Start the delayed_job process"
task :start, :roles => lambda { roles } do
run "cd #{current_path};#{rails_env} script/delayed_job start --queue=$CAPISTRANO:HOST$_queue #{args}"
end
有没有办法按预期使用set
?我希望能够做这样的事情:
set :delayed_job_args, "--queue=#{ hostname }_queue"
更新
我发现了另一种笨拙(而不是那么干燥)的方法来做到这一点,但set
如果可能的话,我仍然想这样做:
desc "Start the delayed_job process"
task :start, :roles => lambda { roles } do
parallel do |session|
session.when "server.host =~ /server1/", "cd #{current_path};#{rails_env} script/delayed_job start --queue=server1_queue #{args}"
session.when "server.host =~ /server2/", "cd #{current_path};#{rails_env} script/delayed_job start --queue=server2_queue #{args}"
session.else "cd #{current_path};#{rails_env} script/delayed_job restart #{args}"
end
end
Rails 3.2.8,delayed_job 3.0.3,capistrano 2.13.4。