Rails 6 ActiveJob 未定义常量ActionMailer::MailDeliveryJob

Rails 6 ActiveJob undefined constant ActionMailer::MailDeliveryJob

我正在将应用程序升级到 Rails 6,在修复所有重大更改后,我现在在从后台作业发送电子邮件时遇到错误。

我通过 ActiveJob 使用 Sidekiq,我相信我已经添加了必要的配置更改:

# config/application.rb

...

config.load_defaults 6.0

# config/initializers/new_framework_defaults_6_0.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

感谢任何帮助,谢谢!

ActionMailer::MailDeliveryJob 是 rails 6 的新功能,之前它被称为 ActionMailer::DeliveryJob(并且仍然存在于 rails 6 中,但带有弃用警告以实现更顺畅的迁移)

看起来你遇到的情况是,来自新 rails 的作业最终出现在仍然是 运行 以前版本的 sidekiq worker 中。 由于实际上是在发送电子邮件 - 很可能您的工作人员同时使用两个 rails 版本。一些工作人员生成错误,工作将被重试,直到它被最终交付的工作人员挑选。

为防止错误,最好使用 action_mailer.delivery_job = "ActionMailer::DeliveryJob" 进行部署,确保所有 worker 都已升级(=使用新代码重新启动),然后才通过切换到 MailDeliveryJob 来移除弃用警告。