LoginSignup
73
68

More than 5 years have passed since last update.

【Rails 4】delayed_jobを使う

Last updated at Posted at 2014-06-15

Rails 4(ActiveRecord)でdelayed_jobを使います。

Gemfile作成

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コマンドでプロセスを開始したり停止したりします。

以下の様なスクリプトファイルを作っておくと便利です。

tools/delayed_job.sh
#!/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/配下になるので適宜、修正して下さい。

設定ファイル

config/initializers/delayed_job_config.rb
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に出力されます。


あと、関係ないけどなのですちゃん可愛い

xx.png

73
68
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
68