delayed_job: https://github.com/collectiveidea/delayed_job
インストール
Gemfileに以下を追加。
gem 'delayed_job_active_record'
mongoidを使ってる場合は以下。
gem 'delayed_job_mongoid'
そして以下を次々と。
rails g delayed_job:active_record
rake db:migrate
delayed_job:active_recordでdelayed_job用のマイグレーションファイルができるので、
それをマイグレーションする流れです。
設定ファイルを作る
config/initializerにdelayed_job.rbを作って以下の内容を入れる。
Delayed::Worker.destroy_failed_jobs = false
Delayed::Worker.sleep_delay = 60
Delayed::Worker.max_attempts = 3
Delayed::Worker.max_run_time = 5.minutes
Delayed::Worker.delay_jobs = !Rails.env.test?
↓こちらのブログでこの辺の内容も詳しく説明しています。
[Rails][非同期処理]delayed_job設定方法まとめ
出くわしたエラー集
マイグレーションファイルができなかった
実は最初はdelayed_job_active_recordじゃなくてgem 'delayed_job'でgemを入れたんです。Herokuのドキュメントにもこっちが書いてあったし。が、delayed_job用のマイグレーションファイルができませんでした。
それでこっちのdelayed_job_active_recordの方でやったらうまくいった次第です。
tobi/delayed_jobの方が本家のdelayed_jobなんですが、最近はcollective/delayed_jobの方がまめに更新されてて機能も豊富でちゃんと動くみたいです。
設定ファイル問題
delayed_jobを入れてプログラムを動かしてみたら、最初以下のようなエラーが出てしまいました。
uninitialized constant Delayed::Job
`method_missing': undefined method `destroy_failed_jobs='
原因は、config/initializer/delayed_job.rbの中に以下のように書いたから。
Delayed::Job.destroy_failed_jobs = false
silence_warnings do
Delayed::Job.const_set("MAX_ATTEMPTS", 3)
Delayed::Job.const_set("MAX_RUN_TIME", 5.minutes)
end
これも本家のdelayed_jobの方を見てこうしたんだけど。
上のエラーが出た人は設定ファイルの内容の方に書いたDelayed::Worker…の方で設定を書くと直るはず!
MailerにdelayをつけたらHerokuで動かなかった(Rails3)
Rails3でメーラーアクションにdelayをつける場合、以下のようにすると公式のドキュメントに書いてあります。
# without delayed_job
Notifier.signup(@user).deliver
# with delayed_job
Notifier.delay.signup(@user)
でも、この通りにしたのに動かない……
DBのdelayed_jobテーブルに残されたエラーログを見ると、以下のようにありました。
Class#sendnews failed with NoMethodError: undefined method `sendnews' for Class:Class
sendnewsのクラスはAdminMailerなのに、それが呼ばれてない風?
調べてみたら、バグっぽい…。
公式の方でもこの件で報告が上がってて、git上では解決されている模様。→↓
https://github.com/collectiveidea/delayed_job/issues/323
ただ、まだ最近fixしたばかりでgemに反映されていないので、delayed_jobのバージョンを落とすと直るということでとりあえず一時的にその対応。
Gemfileのdelayed_jobを以下のようにバージョン固定しbundle install。
gem 'delayed_job', '2.1.4'
最初に入れたのはver 3.0.0です。3.0.xとかにアップデートされたらそれで大丈夫だと思われ。]]>