delayed_job
Railsで非同期実行する際の定番、delayed_job。 ドキュメントが今一分かりにくかったりforkされまくっててどれがオリジナルか分からなかったりするので、メモしておく。
起動・終了・再起動
bundle exec script/delayed_job start # 起動
bundle exec script/delayed_job stop # 終了
bundle exec script/delayed_job restart # 再起動
restartはプロセスが無いと起動してくれないので、stop→startの方が無難。
capistranoのレシピ
namespace :delayed_job do
desc "Start delayed_job process"
task :start, :roles => :job do
run "cd #{current_path}; RAILS_ENV=#{stage} bundle exec script/delayed_job start"
end
desc "Stop delayed_job process"
task :stop, :roles => :job do
run "cd #{current_path}; RAILS_ENV=#{stage} bundle exec script/delayed_job stop"
end
desc "Restart delayed_job process"
task :restart, :roles => :job do
run "cd #{current_path}; RAILS_ENV=#{stage} bundle exec script/delayed_job restart"
end
end
roleはお好みで。appとかやると全サーバで動き始めるのでお勧めしない。
遅延実行
job = Job.new
job.delay.execute
非同期で実行。デフォルトだと5分おき?にリトライされる。
時刻指定実行
job = Job.new
job.send_at Time.zone.now.tomorrow :execute
これくらいで十分ではないかと。 rails runnerで実行してるバッチもdelayed_jobにしたいんだけど(runnerだとRailsのプロセスが丸々一個上がるのでリソースの無駄)、いい方法ないかな。