おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

ActiveJobを使った非同期処理の方法

Ruby on Railsを使って非同期で処理する方法 ActiveJobについてです。

ざっくり手順

  1. generateでjobファイルを作成する
  2. jobをキューに登録する
  3. jobを実行する

generateでjobファイルを作成する

コマンドで $ bundle exec rails g job hoge_job

手作業で jobs/hoge_job.rbに.rbファイルを作成する

jobをキューに登録する

HogeJob.perform_later(event_id: @event.id)

perform_later: 実行キューが積まれて随時処理する

perform_now: 今すぐに実行する

時間指定する方法

明日の正午("2019/06/12 12:00")

HogeJob.set(wait_util: Date.tomorrow.noon).perform_later()

1週間後

HogeJob.set(wait: 1.week).perform_later()

※要注意は時間を指定してはいけない。あくまで日数を指定すること。

呼び出された方

#jobs/hoge_job.rb
class HogeJob
  queue_as :default

  URL = Rails.application.secrets.url
  SUCCESS = 200
  FAILED = 400

  def perform(event_id, status_code = 100)
    response = RestClient.get "#{URL}?event_id=#{event_id}&status_code=#{status_code}"
    result = JSON.parse(response.body).dig('root')
    if result['code'] == FAILED
      Bugsnag.notify(exception, { event_id: event_id, error_message: result['message']})
    end
  end
end

コールバックを指定することもできるので、model的な感じで色々できそうです。

参考サイト

Active Job の基礎 - Rails ガイド