3

サーバーによってタスクを分離しておくために、delayed_job 内で名前付きキューを使用しています。

subdomain = Socket.gethostname.split('.')[0]
MyModel.delay(:queue => (subdomain + "_queue")).get_some_records

各サーバーでdelayed_jobを開始するとき、--queueフラグを設定する必要があります。を使用して、delayed_job CL に引数を渡すことができますset :delayed_job_args。私の知る限り、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"

アップデート

これを行うための別の不器用な(そしてそれほどDRYではない)方法を発見しましたが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。

4

1 に答える 1

0

どうですか…?

set :delayed_job_args, "--queue=#{ $CAPISTRANO:HOST$ }_queue"

Cap でこれを個人的にテストしたことはありませんが、論理的に思えます。

于 2014-02-07T14:07:25.510 に答える