модуль ActiveJob::Exceptions::ClassMethods
Публичные методы экземпляра
# File activejob/lib/active_job/exceptions.rb, line 79
def discard_on(exception)
rescue_from exception do |error|
if block_given?
yield self, error
else
logger.error "Discarded #{self.class} due to a #{exception}. The original exception was #{error.cause.inspect}."
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 45
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, error
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, error|
ExceptionNotifier.caught(error)
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.