При активном вызове задания after_perform при выполнении возникает ошибка?

В документации по rails не указано, будут ли вызваны обратные вызовы, если возникла исключительная ситуация во время выполнения задания. Кто-нибудь может подтвердить это поведение?

Дополнительный вопрос, изменится ли поведение, если кто-то реализует rescue_from?

Что делать, если в rescue_from выдается ошибка?

2 ответа

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

after_performне выполняется, если во время выполнения возникает ошибка perform, даже если он спасен с помощью rescue_from.

Без ошибки

      class FooJob < ActiveJob::Base
  after_perform do |job|
    puts 'after perform'
  end

  def perform
    puts "during perform"
  end
end
      > FooJob.perform_now
during perform
after perform

С ошибкой

      class FooJob < ActiveJob::Base
  after_perform do |job|
    puts 'after perform'
  end

  def perform
    puts "during perform"
    raise "error during perform"
  end
end
      > FooJob.perform_now
during perform
# ... trace
RuntimeError (error during perform)

С ошибкой и спасением

      class FooJob < ActiveJob::Base
  rescue_from(StandardError) do |exception|
    puts 'rescuing standard error: ' + exception.message
  end

  after_perform do |job|
    puts 'after perform'
  end

  def perform
    puts "during perform"
    raise StandardError, "error during perform"
  end
end
      > FooJob.perform_now
during perform
# ... trace
rescuing standard error: error during perform
#<StandardError: error during perform> 
Другие вопросы по тегам