модуль ActiveJob::Exceptions::ClassMethods
Публичные методы экземпляра
# File activejob/lib/active_job/exceptions.rb, line 87
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 50
def retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil)
rescue_from(*exceptions) do |error|
executions = executions_for(exceptions)
if executions < attempts
retry_job wait: determine_delay(seconds_or_duration_or_algorithm: wait, executions: executions), 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) + 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 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 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–2019 David Heinemeier Hansson
Licensed under the MIT License.