module ActiveJob::Exceptions::ClassMethods
Публичные методы экземпляра
# File activejob/lib/active_job/exceptions.rb, line 92
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 56
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 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 секунды), в виде вычисляемого proc, который принимает количество выполненных операций в качестве аргумента, либо в виде символьной ссылки на:exponentially_longer, которая применяет алгоритм ожидания((executions**4) + (Kernel.rand * (executions**4) * jitter)) + 2(первое ожидание ~3с, затем ~18с, затем ~83с и т.д.) -
:attempts- Повторно добавляет задачу в очередь указанное количество раз (по умолчанию: 5 попыток) -
: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 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–2020 David Heinemeier Hansson
Licensed under the MIT License.