ActionMailerの非同期処理をActiveJob+Sidekiqで
この記事がめっちゃ分かりやすいです。ここに従って進めていきます。
http://qiita.com/QUANON/items/09c87787df6b0d287896
1. Redisをインストール
Redisをインストールします。
$ brew install redis
Redisについては、以下らへんが詳しいと思う。
Redisとは、メモリ上にKey-Valueストア(KVS)を構築することができるソフトウェアの一つ。 http://e-words.jp/w/Redis.html
Redisは,メモリ上で動作するキー・バリュー型の揮発性データベースである。揮発性と聞くと,Redis自身が停止したり,Redisが動作しているハードの電源が切れたりすると,Redisに保存されているデータは消失してしまうように思われるが,Redisはデータをディスクに書き込み,永続化させる機能も持ち合わせているのでそれを回避できる。特徴としては,メモリ上にデータを格納するので,非常に高速にデータの書き込み・読み込みを行うことができる。 http://promamo.com/?p=3358
2. sidekiqをインストール
# Gemfile gem 'sidekiq'
$ bundle install
3. adapterを登録
RailsのActiveJobのキューアダプタとしてsidekiqを登録します
# config/application.rb config.active_job.queue_adapter = :sidekiq
$ bundle install
4. redis起動
あらかじめredisを起動しておきます
$ redis-server
5. sidekiqデーモン化
sidekiqの立ち上げは以下のようにできるのですが、ちょっと工夫します。
$ bundle exec sidekiq -q default -q mailers
config/sidekiq.yml
を以下のようにします。
:concurrency: 25 :pidfile: ./tmp/pids/sidekiq.pid :logfile: ./log/sidekiq.log :queues: - default - mailers :daemon: true
このymlファイルを読み込むようにすれば--queue
オプションでmailersというキューを用いることとか全部宣言できます。
$ bundle exec sidekiq -C config/sidekiq.yml
6. Action Mailer設定
こんな感じで#deliver_later
を呼びます。
# app/mailers/honoka_mailer.rb ... def send_welcome_mail UserMailer.welcome(self).deliver_later end ...
ActiveJobすげぇ...というかsidekiqすごい...というかRailsすごい。
テストも書きたい...。
追記(2015/09/23): テスト書きました。=> 【RSpec】ActionMailer+ActiveJobのテストを書く - 珈琲駆動開発
参考
実装読むのが一番
https://github.com/rails/rails/blob/v4.2.0/actionmailer/lib/action_mailer/message_delivery.rb