Railsガイドにきちんと目を通して新しい知識を得る - Active Job の基礎編 -

ドキュメントを読み込むのは大事、ということでRailsガイドを頭から読んでいく取り組みをしています。 各章ごとに、(Railsガイドにちゃんと書いてあるのに)知らなかった機能を雑にまとめていきます。

今回は、Active Job の基礎の章です。

railsguides.jp

キュー名の前に特定のプレフィックスをつける

リンクはこちら

active_job.queue_name_prefixを使うことでキュー名にプレフィックスを追加できます。

# config/application.rb
config.active_job.queue_name_prefix = Rails.env
BookJob.queue_name
#=> "development_default"

コールバック

リンクはこちら

_enqueue_performがあります。
コントローラでいうbefore_actionbefore_performみたいなイメージでしょうか。

class BookJob < ApplicationJob
  before_enqueue -> { puts 'before_enqueue called!' }
  after_enqueue -> { puts 'after_enqueue called!' }
  before_perform -> { puts 'before_perform called!' }
  after_perform -> { puts 'after_perform called!' }

  def perform(*args)
    ...
  end
end
BookJob.perform_later
#=>
before_enqueue called!
after_enqueue called!
before_perform called!
# job実行
after_perform called!

GrobalID

リンクはこちら

ActiveRecordインスタンスを引数に渡せるので、コードが簡潔になります。
ごく普通に引数に渡して使っていましたが、改めて本当に便利だなと思います。

リアライザを定義して独自のクラスのオブジェクトを引数に渡せるようにする

リンクはこちら

独自のクラスは引数としてJobの実行時に渡してもNotImplementedErrorを返します。

BookJob.perform_later(MyClass.new)
#=> NotImplementedError

独自のシリアライザを定義することで(例はRailsガイドにあるので割愛)、引数として渡せるようになります。

例外処理

リンクはこちら

以下のようにrescue_fromを設定することでジョブ実行時の例外をキャッチできます。

class BookJob < ApplicationJob
  rescue_from(ActiveRecord::RecordNotFound) do |exception|
    p 'エラーを捕捉しました'
p exception
  end

  def perform(*args)
    Book.find(-1) # 存在しないID
  end
end
BookJob.perform_now
#=> "エラーを捕捉しました"
#=> #<ActiveRecord::RecordNotFound: Couldn't find Book with 'id'=-1>