Ruby on Rails 5 ActiveJob retry_on, discard_on ловит порядок исключений - PullRequest
0 голосов
/ 25 июня 2018

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

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

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

Я вижу, что discard_on и retry_on в исходном коде должны использовать rescue_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

1 Ответ

0 голосов
/ 05 июля 2018

В моих тестах порядок выполнения точно такой же, как я ожидал, потому что rescue_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
...