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

6

我正在将一个应用程序升级到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中。

非常感谢您的帮助!

1个回答

12

ActionMailer::MailDeliveryJob 是Rails 6中新增的内容,之前称为ActionMailer::DeliveryJob(在Rails 6中仍然存在,但会发出弃用警告以便更平滑迁移)。

看起来你遇到了一种情况,即新版Rails的作业(jobs)进入了一个仍在运行旧版本的Sidekiq worker。由于电子邮件实际上已被发送,很可能你同时具有两个不同版本的worker。一些worker会生成错误并重试作业,直到被一个最终交付的worker捡起。

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


你说得对!为了解决这个问题,我部署了新代码并使用 ps -aux 命令查找旧的 Sidekiq 进程,在找到并杀死一个旧进程后,一切都开始正常工作了,没有错误。谢谢! - Lucas Moulin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接