2017-07-09 13:49:52 -04:00
# frozen_string_literal: true
2017-07-10 09:40:03 -04:00
2016-08-06 12:41:18 -04:00
require_relative " ../support/job_buffer "
require " active_support/core_ext/integer/inflections "
2016-07-29 16:54:55 -04:00
2016-08-01 19:09:16 -04:00
class DefaultsError < StandardError ; end
2019-12-17 13:23:52 -05:00
class DisabledJitterError < StandardError ; end
class ZeroJitterError < StandardError ; end
2018-06-25 18:16:58 -04:00
class FirstRetryableErrorOfTwo < StandardError ; end
class SecondRetryableErrorOfTwo < StandardError ; end
2016-08-02 17:26:56 -04:00
class LongWaitError < StandardError ; end
2016-08-01 19:09:16 -04:00
class ShortWaitTenAttemptsError < StandardError ; end
2016-08-01 19:44:29 -04:00
class ExponentialWaitTenAttemptsError < StandardError ; end
class CustomWaitTenAttemptsError < StandardError ; end
2016-08-01 19:51:11 -04:00
class CustomCatchError < StandardError ; end
2016-08-01 19:09:16 -04:00
class DiscardableError < StandardError ; end
2018-06-25 18:16:58 -04:00
class FirstDiscardableErrorOfTwo < StandardError ; end
class SecondDiscardableErrorOfTwo < StandardError ; end
2017-09-16 14:59:32 -04:00
class CustomDiscardableError < StandardError ; end
2016-07-29 16:54:55 -04:00
class RetryJob < ActiveJob :: Base
2016-08-01 19:09:16 -04:00
retry_on DefaultsError
2019-12-17 13:23:52 -05:00
retry_on DisabledJitterError , jitter : nil
retry_on ZeroJitterError , jitter : 0 . 0
2019-01-04 19:54:38 -05:00
retry_on FirstRetryableErrorOfTwo , SecondRetryableErrorOfTwo , attempts : 4
2016-08-02 17:26:56 -04:00
retry_on LongWaitError , wait : 1 . hour , attempts : 10
2016-08-01 19:09:16 -04:00
retry_on ShortWaitTenAttemptsError , wait : 1 . second , attempts : 10
2016-08-01 19:44:29 -04:00
retry_on ExponentialWaitTenAttemptsError , wait : :exponentially_longer , attempts : 10
retry_on CustomWaitTenAttemptsError , wait : - > ( executions ) { executions * 2 } , attempts : 10
2018-05-21 09:43:16 -04:00
retry_on ( CustomCatchError ) { | job , error | JobBuffer . add ( " Dealt with a job that failed to retry in a custom way after #{ job . arguments . second } attempts. Message: #{ error . message } " ) }
2018-07-25 04:30:38 -04:00
retry_on ( ActiveJob :: DeserializationError ) { | job , error | JobBuffer . add ( " Raised #{ error . class } for the #{ job . executions } time " ) }
2018-06-25 18:16:58 -04:00
2016-08-01 19:09:16 -04:00
discard_on DiscardableError
2018-06-25 18:16:58 -04:00
discard_on FirstDiscardableErrorOfTwo , SecondDiscardableErrorOfTwo
2018-05-21 09:43:16 -04:00
discard_on ( CustomDiscardableError ) { | job , error | JobBuffer . add ( " Dealt with a job that was discarded in a custom way. Message: #{ error . message } " ) }
2016-07-29 16:54:55 -04:00
2019-01-07 08:36:56 -05:00
before_enqueue do | job |
if job . arguments . include? ( :log_scheduled_at ) && job . scheduled_at
JobBuffer . add ( " Next execution scheduled at #{ job . scheduled_at } " )
end
end
def perform ( raising , attempts , * )
2019-01-04 19:54:38 -05:00
raising = raising . shift if raising . is_a? ( Array )
if raising && executions < attempts
2016-07-29 16:54:55 -04:00
JobBuffer . add ( " Raised #{ raising } for the #{ executions . ordinalize } time " )
raise raising . constantize
else
JobBuffer . add ( " Successfully completed job " )
end
end
end