#ruby-on-rails #rails-activejob
#ruby-on-rails #rails-activejob
Вопрос:
Я не понимаю, как ActiveJob
обрабатываются повторные попытки, когда возникает исключение во время выполнения задания. В руководстве Rails о ActiveJob
есть этот пример:
10.1 Повторная попытка или удаление неудачных заданий
Также возможно повторить попытку или отменить задание, если во время выполнения возникает исключение. Например:
class RemoteServiceJob < ApplicationJob retry_on CustomAppException # defaults to 3s wait, 5 attempts discard_on ActiveJob::DeserializationError def perform(*args) # Might raise CustomAppException or ActiveJob::DeserializationError end end
Для получения более подробной информации см. Документацию API для
ActiveJob::Exceptions
.
Это означает, что существует метод, который явно указывает ActiveJob
повторить задание для определенных исключений, и в то же время существует метод, который явно указывает ActiveJob
отменить задание для определенных исключений.
Но как ActiveJob
обрабатывать исключения, когда разработчик не определил retry_on
или discard_on
? Каково поведение по умолчанию? Отменит ли это задание? Будет ли это повторять задание? И если да, то как часто и через какой интервал?
Комментарии:
1. То, как фактически выполняются задания, зависит от используемого адаптера. Вы можете найти реализацию встроенного адаптера в ActiveJob::Execution . Насколько я могу судить, у него нет списка исключений по умолчанию, который он обрабатывает.
2. Асинхронный адаптер по умолчанию в значительной степени зависит от параллельного ruby gem для выполнения. Смотрите документы для Concurrent::ScheduledTask#execute .
3. @max Таким образом, вы говорите, что поведение по умолчанию для неудачных попыток выполнения активных заданий полностью зависит от используемого серверной части? Это означает, что для одного серверного сервера (например, Sidekiq) по умолчанию может выполняться многократная попытка в течение нескольких дней, тогда как при переключении на другой серверный сервер по умолчанию может быть отменено задание при сбое?
4. Да, это мое понимание.