Spec-Zone.ru › Ruby on Rails 7.1

модуль ActiveJob::Exceptions::ClassMethods

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

after_discard(&blk) Показать исходный код
# File activejob/lib/active_job/exceptions.rb, line 130
def after_discard(&blk)
  self.after_discard_procs += [blk]
end

Блок кода, который выполняется, когда задача собирается быть отброшена по любой причине.

Пример

class WorkJob < ActiveJob::Base
  after_discard do |job, exception|
    ExceptionNotifier.report(exception)
  end

  ...

end
discard_on(*exceptions) { |self, error| ... } Показать исходный код
# File activejob/lib/active_job/exceptions.rb, line 109
def discard_on(*exceptions)
  rescue_from(*exceptions) do |error|
    instrument :discard, error: error do
      yield self, error if block_given?
      run_after_discard_procs(error)
    end
  end
end

Отбросить задачу без попыток повторной обработки, если возникает указанное исключение. Это полезно, когда объект задачи, например, запись в Active Record, больше недоступен, и задача, таким образом, больше не актуальна.

Вы также можете передать блок кода, который будет вызван. Этот блок будет вызван с экземпляром задачи в качестве первого и экземпляром ошибки в качестве второго параметра.

Обработчики `retry_on` и `discard_on` ищутся снизу вверх и вверх по иерархии классов. Обработчик первого класса, для которого exception.is_a?(klass) выполняется, будет вызван, если таковой имеется.

Пример

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 62
      def retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil, jitter: JITTER_DEFAULT)
        if wait == :exponentially_longer
          ActiveJob.deprecator.warn(<<~MSG.squish)
            `wait: :exponentially_longer` will actually wait polynomially longer and is therefore deprecated.
            Prefer `wait: :polynomially_longer` to avoid confusion and keep the same behavior.
          MSG
        end
        rescue_from(*exceptions) do |error|
          executions = executions_for(exceptions)
          if attempts == :unlimited || 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
              run_after_discard_procs(error)
            else
              instrument :retry_stopped, error: error
              run_after_discard_procs(error)
              raise error
            end
          end
        end
      end

Перехватывает исключение и перепланирует задачу для повторного выполнения через указанное количество секунд, для определенного числа попыток. Если исключение продолжает возникать после указанного числа попыток, исключение разрешается подняться до базовой системы очередей, которая может иметь свою собственную механику повторных попыток или поместить его в очередь ожидания для проверки.

Вы также можете передать блок кода, который будет вызван, если попытки повторной обработки завершатся неудачей, для реализации пользовательской логики вместо поднятия исключения. Этот блок будет вызван с экземпляром задачи в качестве первого и экземпляром ошибки в качестве второго параметра.

Обработчики `retry_on` и `discard_on` ищутся снизу вверх и вверх по иерархии классов. Обработчик первого класса, для которого exception.is_a?(klass) выполняется, будет вызван, если таковой имеется.

Параметры

  • :wait — Перезапускает задачу с задержкой, указанной в секундах (по умолчанию: 3 секунды), как вычисляемую процедуру, которая принимает в качестве аргумента количество выполненных запусков, или как ссылку на символ :polynomially_longer, который применяет алгоритм ожидания ((executions**4) + (Kernel.rand * (executions**4) * jitter)) + 2 (первое ожидание ~3с, затем ~18с, затем ~83с и т. д.)

  • :attempts — Перезапускает задачу указанное количество раз (по умолчанию: 5 попыток) или ссылкой на символ :unlimited для повторного выполнения задачи до её успешного завершения

  • :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 CustomInfrastructureException, wait: 5.minutes, attempts: :unlimited

  retry_on ActiveRecord::Deadlocked, wait: 5.seconds, attempts: 3
  retry_on Net::OpenTimeout, Timeout::Error, wait: :polynomially_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: :polynomially_longer, attempts: 10
  # retry_on Net::ReadTimeout, wait: 5.seconds, jitter: 0.30, attempts: 10
  # retry_on Timeout::Error, wait: :polynomially_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–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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