Rails 4(ActiveRecord)でdelayed_jobを使います。
Gemfile作成
gem "delayed_job"
gem "delayed_job_active_record"
# デプロイ先でデーモンとして動かすのに必要
gem "daemons"
インストールとマイグレーション
bundle install
bundle exec rails generate delayed_job:active_record
bundle exec rake db:migrate
実行ファイルはbin/delayed_jobに作成されます。
Rails3以前はscript/delayed_jobに作られていたので要注意なのです。
ワーカーはrakeタスクで手軽に起動できます。
開発環境ではこれでテストしましょう。
bundle exec rake jobs:work
非同期処理を実装
キューに入れたいメソッドは次のようにdelayを挟んで呼び出します。
SomeClass.delay.some_method(args)
例えば、Twitterのような外部サイトへツイートするような以下の処理がある場合、
@user.tweet('Hi!')
を
@user.delay.tweet('Hi!')
とするだけなのです。
デプロイ環境ではdelayed_job
コマンドでプロセスを開始したり停止したりします。
以下の様なスクリプトファイルを作っておくと便利です。
#!/bin/bash
bundle exec ../bin/delayed_job $1
アプリケーションディレクトリ配下にtools/
というディレクトリを作っておき、その中にdelayed_jobs.sh
を入れておきます。
# 開始
tools/delayed_jobs.sh start
# 停止
tools/delayed_jobs.sh stop
# 再起動
tools/delayed_jobs.sh restart
などと出来ます。
※ Rails 3ではdelayed_job
の位置がscript/
配下になるので適宜、修正して下さい。
設定ファイル
Delayed::Worker.destroy_failed_jobs = false # 失敗したジョブをDBから削除しない=false
Delayed::Worker.sleep_delay = 60 # 実行ジョブがない場合に次回実行までのSleep時間(秒)
Delayed::Worker.max_attempts = 3 # リトライ回数
Delayed::Worker.max_run_time = 5.minutes # 最大実行時間
ログファイル
delayed_jobsワーカーのログはlog/delayed_job.log
に出力されます。
あと、関係ないけどなのですちゃん可愛い