2012-03-01 13 views
12

Tôi đang xem xét việc sử dụng hàng đợi với delay_job. Tôi đã tìm thấy this page trong đó vạch ra nhiều cách khác nhau bắt đầu lao động, tuy nhiên tôi muốn giữ hiện của tôi Capistrano phương pháp:Bắt đầu nhiều nhân viên DelayedJob với hàng đợi cụ thể qua các nhiệm vụ Capistrano

set :delayed_job_args, "-n 2 -p ecv2.production" 
after "deploy:start", "delayed_job:start" 
... 

tôi đã tự hỏi làm thế nào tôi có thể sửa đổi các delayed_job_args để xử lý sinh sản 1 công nhân với một hàng đợi cụ thể và 1 công nhân cho mọi công việc khác. Cho đến nay, tất cả những gì tôi có là ghi đè mỗi tác vụ như vậy:

namespace :delayed_job do 
    task :restart, :roles => :app do 
    run "cd #{current_path}; RAILS_ENV=#{rails_env} script/delayed_job -p ecv2.production --queue=export restart" 
    run "cd #{current_path}; RAILS_ENV=#{rails_env} script/delayed_job -p ecv2.production restart" 
    end 
end 

... Nhưng điều đó không vui. Bất kỳ đề xuất?

Trả lời

4

Sau một chút lộn xộn, mẹo tôi tìm thấy là hoàn nguyên về 'set: delay_job_args' và sử dụng --queues = (số nhiều) thay vì --queue = (số ít). Hy vọng điều này sẽ giúp bất cứ ai khác chạy vào cùng một vấn đề.

set :delayed_job_args, "-n 2 -p ecv2.production --queues=cache,export" 

UPDATE: Những gì tôi đang sử dụng bây giờ ...

after "deploy:stop", "delayed_job:stop" 
after "deploy:start", "delayed_job:start" 
after "deploy:restart", "delayed_job:restart" 

namespace :delayed_job do 
    # See 'man nice' for details, default priority is 10 and 15 is a bit lower 
    task :start, :roles => :app do 
    run "cd #{current_path}; #{rails_env} nice -n 15 ruby script/delayed_job -n 1 -p yourapp.#{application} start" 
    end 

    task :restart, :roles => :app do 
    stop 
    start 
    end 
end 
+0

Đó chỉ bắt đầu 2 công nhân xử lý cùng 2 hàng đợi, phải không? Không phải những gì bạn đang yêu cầu. – RocketR

+0

Không phải những gì tôi đã hy vọng, không. Nhưng điều tốt nhất tôi có thể nghĩ ra lúc đó. –

+0

Tôi hiểu. Tôi đã đi với một lệnh riêng biệt cho mỗi hàng đợi, giống như bạn đã viết trong câu hỏi. Dường như các nhiệm vụ capistrano của DJ không phù hợp với nhiều hàng đợi. – RocketR

5

tôi chia công việc của tôi thành hai hàng đợi với một công nhân bị cô lập cho mỗi hàng đợi với thiết lập này trong tập tin deploy.rb tôi:

namespace :delayed_job do 
    task :start, roles: :app do 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_one --queue=one start" 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_two --queue=two start" 
    end 

    task :stop, roles: :app do 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_one --queue=one stop" 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_two --queue=two stop" 
    end 

    task :restart, roles: :app do 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_one --queue=one restart" 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_two --queue=two restart" 
    end 
end 

Phần -i name một phần của lệnh là rất quan trọng. Đó là phần cho phép nhiều trường hợp delayed_job chạy.

Nếu bạn muốn thêm người lao động hàng đợi cụ thể, sau đó bạn sẽ mở rộng chúng ra như thế này (nơi tôi có hai công nhân hoàn toàn vào hàng đợi một, và một nhân viên hoàn toàn vào hàng đợi hai):

namespace :delayed_job do 
    task :start, roles: :app do 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one1 --queue=one start" 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one2 --queue=one start" 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i two --queue=two start" 
    end 

    task :stop, roles: :app do 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one1 stop" 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one2 stop" 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i two stop" 
    end 

    task :restart, roles: :app do 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one1 --queue=one restart" 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one2 --queue=one restart" 
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i two --queue=two restart" 
    end 
end