ドキュメントを読み込むのは大事、ということでRailsガイドを頭から読んでいく取り組みをしています。 各章ごとに、(Railsガイドにちゃんと書いてあるのに)知らなかった機能を雑にまとめていきます。
今回は、Active Job の基礎の章です。
キュー名の前に特定のプレフィックスをつける
リンクはこちら
active_job.queue_name_prefix
を使うことでキュー名にプレフィックスを追加できます。
# config/application.rb config.active_job.queue_name_prefix = Rails.env
BookJob.queue_name #=> "development_default"
コールバック
リンクはこちら
_enqueue
と_perform
があります。
コントローラでいうbefore_action
がbefore_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>