Ruby on Rails 5 ActiveJob retry_on, discard_on порядок исключения перехвата

Я использую ActiveJob, и у меня есть несколько вопросов о методах discard_on и retry_on, которые перехватывают исключения.

  1. Определяет ли ActiveJob их порядок и порядок выполнения? (Я предполагаю, что это связано, но я не уверен.)

  2. Предполагая актуальность, я надеюсь, что retry_on перехватывает только пользовательские исключения, а discard_on перехватывает другие исключения.

Я вижу discard_on и retry_on в источнике код должен использовать escape_from, потому что после rescue_from определенный оператор для выполнения в первую очередь, так что вот как я определил свои предположения, надеюсь, вы можете помочь мне указать, правильно ли это, конечно, если у вас есть лучший способ достичь той же функциональности не могли бы вы сказать мне, большое спасибо.

class RemoteServiceJob < ActiveJob::Base      
  discard_on StandardError # second catch other exceptions
  retry_on MyCustomException, wait: 5.seconds, attempts: 3 # first catch custom exceptions
end

person YaEvan    schedule 25.06.2018    source источник


Ответы (1)


В моих тестах порядок выполнения точно такой же, как я и ожидал, потому что escape_from выполняется в порядке, обратном объявлению, и порядок объявления исключений должен быть таким же.

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

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
person YaEvan    schedule 05.07.2018