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のプロセスが丸々一個上がるのでリソースの無駄)、いい方法ないかな。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>