Rails 6 ActiveJob неопределенная константа ActionMailer::MailDeliveryJob

Я обновляю приложение до Rails 6, и после исправления всех критических изменений я сталкиваюсь с ошибкой при отправке электронных писем из фоновых заданий.

Я использую Sidekiq через ActiveJob и считаю, что добавил необходимые изменения в конфигурацию:

# config/application.rb

...

config.load_defaults 6.0

# config/initializers/new_framework_defaultsActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper0.rb

...

Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob"

Я отправляю электронные письма с помощью deliver_later, например: UserMailer.notify(user).deliver_later

Важным аспектом является то, что электронные письма доставляются, хотя я получаю сообщение об ошибке

Сообщение об ошибке:

NameError:
uninitialized constant ActionMailer::MailDeliveryJob
Did you mean?  ActionMailer::DeliveryJob

Согласно Rollbar контекст ошибки ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper

Любая помощь приветствуется, спасибо!


person Lucas Moulin    schedule 09.10.2019    source источник


Ответы (1)


ActionMailer::MailDeliveryJob является новым для рельсов 6, ранее он назывался ActionMailer::DeliveryJob (и все еще присутствует в рельсах 6, но с предупреждением об устаревании для более плавной миграции)

Похоже, у вас есть ситуация, когда задания из новых рельсов оказались в воркере sidekiq, на котором все еще работает предыдущая версия. Поскольку электронные письма действительно доставляются, скорее всего, у вас есть воркеры с обеими версиями рельсов одновременно. Некоторые работники генерируют ошибку, и задание повторяется до тех пор, пока оно не будет выбрано работником, который, наконец, выполнит задание.

Чтобы предотвратить ошибку, лучше выполнить развертывание с action_mailer.delivery_job = "ActionMailer::DeliveryJob", убедиться, что все рабочие процессы обновлены (=перезапущены с новым кодом), и только затем удалить предупреждение об устаревании, переключившись на MailDeliveryJob.

person Vasfed    schedule 09.10.2019
comment
Вы правы! Чтобы исправить это, я развернул новый код и использовал ps -aux для поиска старых процессов Sidekiq, после обнаружения и уничтожения старого процесса все заработало без ошибок. Спасибо! - person Lucas Moulin; 10.10.2019