Post

Active jobのretryの検証

ソース

# frozen_string_literal: true class RetryTestJob < ActiveJob::Base class RetryOnlyDoError < StandardError; end class RetryRailseExceptionError < StandardError; end class RetryWithoutProcessError < StandardError; end class DiscardError < StandardError; end FILENAME = "#{Rails.root.to_s}/tmp/jobtest.txt" queue_as :high discard_on StandardError do |job, e| RetryTestJob.write_file("retry_on", job.job_id, job.executions, "#{e.class}: #{e.message}") end # attempts が0になっても何も行わない retry_on RetryWithoutProcessError, wait: 1.seconds, attempts: 3 # attempts が0になった場合に処理を行う retry_on(RetryOnlyDoError, wait: 1.seconds, attempts: 2) do |job, e| RetryTestJob.write_file("retry_on", job.job_id, job.executions, "#{e.class}: #{e.message}") end # 無限にRetryしてしまう retry_on(RetryRailseExceptionError, wait: 1.seconds, attempts: 2) do |job, e| RetryTestJob.write_file("retry_on", job.job_id, job.executions, "#{e.class}: #{e.message}") raise StandardError, "raise StandardError from retry_on: #{job.executions}, #{e.message}" end def perform RetryTestJob.write_file("perform", job_id, executions) # 確認したいエラーに切り替える # error = StandardError error = RetryOnlyDoError # error = RetryRailseExceptionError # error = RetryWithoutProcessError raise error, "raise #{error.name} from perform: #{job_id}, #{executions}" end private def self.write_file(action, job_id, executions, message=nil) File.open(FILENAME, 'a') { |f| f.write("#{action}[#{job_id}, #{executions}]#{message ? ": #{message}" : ""}\n") } end end

結果

StandardError の場合

perform[fdf6cc91-2f25-4c9c-ac7c-aedbe2202bea, 1] retry_on[fdf6cc91-2f25-4c9c-ac7c-aedbe2202bea, 1]: StandardError: raise StandardError from perform: fdf6cc91-2f25-4c9c-ac7c-aedbe2202bea, 1

RetryOnlyDoError の場合

perform[304646d3-649d-422c-9b04-0b0f551f49c7, 1] perform[304646d3-649d-422c-9b04-0b0f551f49c7, 2] retry_on[304646d3-649d-422c-9b04-0b0f551f49c7, 2]: RetryTestJob::RetryOnlyDoError: raise RetryTestJob::RetryOnlyDoError from perform: 304646d3-649d-422c-9b04-0b0f551f49c7, 2

RetryRailseExceptionError の場合

retry_on 内でエラーが発生した場合は、無限に実行されるので気をつける。

perform[bff00afd-a3a1-4bf4-93ed-987ed600bed8, 1] perform[bff00afd-a3a1-4bf4-93ed-987ed600bed8, 2] retry_on[bff00afd-a3a1-4bf4-93ed-987ed600bed8, 2]: RetryTestJob::RetryRailseExceptionError: raise RetryTestJob::RetryRailseExceptionError from perform: bff00afd-a3a1-4bf4-93ed-987ed600bed8, 2 perform[bff00afd-a3a1-4bf4-93ed-987ed600bed8, 2] retry_on[bff00afd-a3a1-4bf4-93ed-987ed600bed8, 2]: RetryTestJob::RetryRailseExceptionError: raise RetryTestJob::RetryRailseExceptionError from perform: bff00afd-a3a1-4bf4-93ed-987ed600bed8, 2 perform[bff00afd-a3a1-4bf4-93ed-987ed600bed8, 2] retry_on[bff00afd-a3a1-4bf4-93ed-987ed600bed8, 2]: RetryTestJob::RetryRailseExceptionError: raise RetryTestJob::RetryRailseExceptionError from perform: bff00afd-a3a1-4bf4-93ed-987ed600bed8, 2

RetryWithoutProcessError

perform[aae6bf69-422d-44b2-b575-e7d425f0e976, 1] perform[aae6bf69-422d-44b2-b575-e7d425f0e976, 2] perform[aae6bf69-422d-44b2-b575-e7d425f0e976, 3]
This post is licensed under CC BY 4.0 by the author.