はじめてのRuby on Rails、トラブル記録
<< Windowsでruby1.9.xとrails3.xをインストールする(2012年1月版) | TOP | Deviseでundefined local variable or method `resource_name' >>
スポンサーサイト

一定期間更新がないため広告を表示しています

posted by スポンサードリンク | | - | - | - |はてなブックマーク - スポンサーサイト
Rails3でdelayed_jobを使う
Herokuでも使える非同期処理プラグインのdelayed_job、Rails3で設定してみました。

delayed_job: https://github.com/collectiveidea/delayed_job

1 インストール
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用のマイグレーションファイルができるので、
それをマイグレーションする流れです。

2 設定ファイルを作る
config/initializerにdelayed_job.rbを作って以下の内容を入れる。
Delayed::Worker.destroy_failed_jobs = false
# 実行失敗したジョブを削除:falseだとfailed_atに時間が入ってDBに残る
Delayed::Worker.sleep_delay = 60 # スリープタイム
Delayed::Worker.max_attempts = 3 # 最大実行回数
Delayed::Worker.max_run_time = 5.minutes  # 最長実行時間
Delayed::Worker.delay_jobs = !Rails.env.test? # テスト環境ではdelayed_jobをうごかさない
↓こちらのブログでこの辺の内容も詳しく説明しています。
[Rails][非同期処理]delayed_job設定方法まとめ


爆弾 出くわしたエラー集

1 マイグレーションファイルができなかった
実は最初はdelayed_job_active_recordじゃなくてgem 'delayed_job'でgemを入れたんです。Herokuのドキュメントにもこっちが書いてあったし。が、delayed_job用のマイグレーションファイルができませんでした。
それでこっちのdelayed_job_active_recordの方でやったらうまくいった次第です。

tobi/delayed_jobの方が本家のdelayed_jobなんですが、最近はcollective/delayed_jobの方がまめに更新されてて機能も豊富でちゃんと動くみたいです。

2 設定ファイル問題
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…の方で設定を書くと直るはず!

3 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とかにアップデートされたらそれで大丈夫だと思われ。
posted by トモト | 22:41 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3でdelayed_jobを使う
スポンサーサイト
posted by スポンサードリンク | 22:41 | - | - | - |はてなブックマーク - スポンサーサイト
コメント
コメントする










この記事のトラックバックURL
http://hajimete-ruby.jugem.jp/trackback/83
トラックバック
Rails3レシピブック 190の技
Rails3レシピブック 190の技
ついにRails3対応版が出ました!!
WEB+DB PRESS Vol.58
WEB+DB PRESS Vol.58
Rails2系から3への移行時に知りたいことがひとまとまりになっててよかった!色々ググるよりこれを読む方が早い。
Rubyレシピブック 第3版 303の技
Rubyレシピブック 第3版 303の技
Rubyやるならこのリファレンスは必要。
Search this site