модуль ActiveJob::Exceptions::ClassMethods
Публичные методы экземпляров
# File activejob/lib/active_job/exceptions.rb, line 71
def discard_on(exception)
rescue_from exception do |error|
logger.error "Discarded #{self.class} due to a #{exception}. The original exception was #{error.cause.inspect}."
end
end Отбросить задачу без попыток повторной обработки, если возникает исключение. Это полезно, когда объект задачи, например, Active Record, больше недоступен, и задача больше не актуальна.
Пример
class SearchIndexingJob < ActiveJob::Base
discard_on ActiveJob::DeserializationError
def perform(record)
# Will raise ActiveJob::DeserializationError if the record can't be deserialized
end
end
# File activejob/lib/active_job/exceptions.rb, line 43
def retry_on(exception, wait: 3.seconds, attempts: 5, queue: nil, priority: nil)
rescue_from exception do |error|
if executions < attempts
logger.error "Retrying #{self.class} in #{wait} seconds, due to a #{exception}. The original exception was #{error.cause.inspect}."
retry_job wait: determine_delay(wait), queue: queue, priority: priority
else
if block_given?
yield self, exception
else
logger.error "Stopped retrying #{self.class} due to a #{exception}, which reoccurred on #{executions} attempts. The original exception was #{error.cause.inspect}."
raise error
end
end
end
end Перехватить исключение и запланировать задачу на повторное выполнение через определенное количество секунд, для определенного числа попыток. Если исключение продолжает возникать после указанного числа попыток, исключение разрешается подняться к подлежащей системе очереди, которая может иметь собственный механизм повторной обработки или поместить его в очередь ожидания для проверки.
Вы также можете передать блок, который будет вызван, если попытки повторной обработки завершатся неудачей, для реализации пользовательской логики, вместо того, чтобы позволить исключению подняться вверх. Этот блок вызывается с экземпляром задачи в качестве первого и экземпляром ошибки в качестве второго параметра.
Параметры
-
:wait- Повторно вставляет задачу с задержкой, указанной в секундах (по умолчанию: 3 секунды), как вычислительную функцию, которая принимает число выполненных попыток в качестве аргумента, или в виде символьной ссылки на:exponentially_longer, что применяет алгоритм ожидания(executions ** 4) + 2(сначала 3 секунды, затем 18 секунд, затем 83 секунды и т. д) -
:attempts- Повторно вставляет задачу указанное число раз (по умолчанию: 5 попыток) -
:queue- Повторно вставляет задачу в другую очередь -
:priority- Повторно вставляет задачу с другим приоритетом
Примеры
class RemoteServiceJob < ActiveJob::Base
retry_on CustomAppException # defaults to 3s wait, 5 attempts
retry_on AnotherCustomAppException, wait: ->(executions) { executions * 2 }
retry_on(YetAnotherCustomAppException) do |job, exception|
ExceptionNotifier.caught(exception)
end
retry_on ActiveRecord::Deadlocked, wait: 5.seconds, attempts: 3
retry_on Net::OpenTimeout, wait: :exponentially_longer, attempts: 10
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 when the remote service is down
end
end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.