модуль ActiveJob::Exceptions::ClassMethods
Общедоступные методы экземпляра
# File activejob/lib/active_job/exceptions.rb, line 94
def discard_on(*exceptions)
rescue_from(*exceptions) do |error|
instrument :discard, error: error do
yield self, error if block_given?
end
end
end Отбросить задачу без попыток повторной обработки, если возникло исключение. Это полезно, когда объект задачи, например, Active Record, больше недоступен, и задача больше не актуальна.
Вы также можете передать блок, который будет вызван. Этот блок вызывается с экземпляром задачи в качестве первого и экземпляром ошибки в качестве второго параметра.
Пример
class SearchIndexingJob < ActiveJob::Base
discard_on ActiveJob::DeserializationError
discard_on(CustomAppException) do |job, error|
ExceptionNotifier.caught(error)
end
def perform(record)
# Will raise ActiveJob::DeserializationError if the record can't be deserialized
# Might raise CustomAppException for something domain specific
end
end
# File activejob/lib/active_job/exceptions.rb, line 58
def retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil, jitter: JITTER_DEFAULT)
rescue_from(*exceptions) do |error|
executions = executions_for(exceptions)
if attempts == :unlimited || executions < attempts
retry_job wait: determine_delay(seconds_or_duration_or_algorithm: wait, executions: executions, jitter: jitter), queue: queue, priority: priority, error: error
else
if block_given?
instrument :retry_stopped, error: error do
yield self, error
end
else
instrument :retry_stopped, error: error
raise error
end
end
end
end Перехватить исключение и запланировать задачу на повторное выполнение через заданное количество секунд, для определенного количества попыток. Если исключение продолжает возникать после указанного числа попыток, исключение разрешается подниматься до базовой системы очереди, которая может иметь собственный механизм повторной обработки или поместить ее в очередь ожидания для проверки.
Вы также можете передать блок, который будет вызван, если попытки повторной обработки завершатся неудачей для реализации пользовательской логики вместо того, чтобы поднимать исключение. Этот блок вызывается с экземпляром задачи в качестве первого и экземпляром ошибки в качестве второго параметра.
Параметры
-
:wait- Перезапускает задачу с задержкой, указанной в секундах (по умолчанию: 3 секунды), как вычисляемый метод, который принимает количество выполнений до настоящего момента в качестве аргумента, или как символьное обозначение:exponentially_longer, которое применяет алгоритм ожидания((executions**4) + (Kernel.rand * (executions**4) * jitter)) + 2(первое ожидание ~3с, затем ~18с, затем ~83с и т.д.) -
:attempts- Перезапускает задачу указанное количество раз (по умолчанию: 5 попыток) или символьное обозначение:unlimitedдля повторной обработки задачи до ее успешного выполнения -
:queue- Перезапускает задачу в другой очереди -
:priority- Перезапускает задачу с другим приоритетом -
:jitter- Случайная задержка времени ожидания, используемая при расчете отката. По умолчанию 15% (0,15), что представляет собой верхнюю границу возможного времени ожидания (выраженного в процентах)
Примеры
class RemoteServiceJob < ActiveJob::Base
retry_on CustomAppException # defaults to ~3s wait, 5 attempts
retry_on AnotherCustomAppException, wait: ->(executions) { executions * 2 }
retry_on CustomInfrastructureException, wait: 5.minutes, attempts: :unlimited
retry_on ActiveRecord::Deadlocked, wait: 5.seconds, attempts: 3
retry_on Net::OpenTimeout, Timeout::Error, wait: :exponentially_longer, attempts: 10 # retries at most 10 times for Net::OpenTimeout and Timeout::Error combined
# To retry at most 10 times for each individual exception:
# retry_on Net::OpenTimeout, wait: :exponentially_longer, attempts: 10
# retry_on Net::ReadTimeout, wait: 5.seconds, jitter: 0.30, attempts: 10
# retry_on Timeout::Error, wait: :exponentially_longer, attempts: 10
retry_on(YetAnotherCustomAppException) do |job, error|
ExceptionNotifier.caught(error)
end
def perform(*args)
# Might raise CustomAppException, AnotherCustomAppException, or YetAnotherCustomAppException for something domain specific
# Might raise ActiveRecord::Deadlocked when a local db deadlock is detected
# Might raise Net::OpenTimeout or Timeout::Error when the remote service is down
end
end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.