При активном вызове задания 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>