Spec-Zone.ru › Ruby on Rails 6.1

module ActiveJob::Exceptions::ClassMethods

Публичные методы экземпляра

discard_on(*exceptions) { |self, error| ... } Показать исходный код
# 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
retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil, jitter: JITTER_DEFAULT) { |self, error| ... } Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API