Active Jobとは?
Rails4.2から使えるようになりました。バックグラウンドジョブを共通的なインターフェースを使う仕組みです。ジョブをメモリに保持するためのキューイングの枠組を提供してくれます。(RailsのプロセスにキューイングしているのでRailsを再起動すると現在キューイングしているジョブは全て失われてしまうので注意が必要になります。)
ただ、実際に現場でよく行われている非同期処理はActive Jobだけでは行うことはできません。下記のようなバックグラウンドジョブ動かすためのツールをActive Jobと合わせて使う必要があります。
- Sidekiq
- Resque
- DelayedJob
Sidekiqについて
複数のジョブをキュー管理して並列で実行できます。デフォルトで最大25個のジョブを並列で実行可能で設定を増減できます。マシンがクラッシュする可能性があるので最大50個までにするよう指定があります。
非同期処理ツール(Sidekiq)の導入
Gemfileに下記の記述を追加します。
1 |
gem 'sidekiq' |
bundleします。
1 |
bundle |
下記コマンドでsidekiqを起動します。
1 |
bundle exec sidekiq |
config/environments/development.rbに下記記述を追加します。
1 |
config.active_job.queue_adapter = :sidekiq |
Redisを導入する。
SidekiqはRedisというDBをデフォルトで使用しているのでSidekiqによる非同期処理を行いたい場合は必ず導入する必要があります。
1 |
brew install redis |
redisの起動
1 |
redis-server |
ジョブを作成する。
下記コマンドでジョブが作成されます。
1 |
rails g job ジョブ名 |
すると非同期に実行したい処理を「app/jobs/ジョブ名_job.rb」というファイルが自動生成されるのでここのperformメソッド内部に非同期で実行したい処理を記述をすることになります。
コントローラー側
上記のジョブを非同期で呼び出すメソッドを記述します。
ジョブをキューに登録する。
1 |
ジョブ名Jobクラス.perform_later |
ジョブの実行を予約します。ただジョブの登録を行うだけでジョブの開始や完了を待つことはないです。他タスクで忙しくない等、処理が実行可能になったらバックグラウンドで処理が可能になります。
日時を指定して実行する。
1 |
ジョブ名Jobクラス.set(実行したい日時).perform_later |
この記事へのコメントはありません。