devise-async配合Sidekiq入队的邮件任务未执行如何排查?
问题排查与修复方案
核心问题:队列名称不匹配
从你的运行日志可以明确看到,重置密码邮件任务被推送到了**mailers(复数)**队列:
I, [2021-09-16T19:20:07.853680 #51261] INFO -- : [ActiveJob] Enqueued ActionMailer::MailDeliveryJob (Job ID: d49ca82c-6418-4848-8268-3ec72407f828) to Sidekiq(mailers) with arguments: ...
但你使用的Sidekiq启动命令仅监听了**mailer(单数)**和default队列:
sidekiq -q default -q mailer
Sidekiq只会消费启动参数中显式指定的队列,因此mailers队列中的任务会一直处于待处理状态,不会被执行。
修复方法二选一:
- 修改Sidekiq启动参数,监听正确的队列:
sidekiq -q default -q mailers
- 手动指定devise-async使用的队列名称,修改
config/initializer/devise-async.rb配置:
Devise::Async.setup do |config| config.enabled = true config.queue = 'mailer' # 队列名和启动参数保持一致 end
其他可选排查点
如果修改队列配置后仍有问题,可以按以下顺序排查:
- 检查版本兼容性:如果你近期升级过Rails(尤其是Rails 6+),请将
devise-async升级到最新稳定版,旧版本对ActiveJob的适配存在已知问题 - 查看Sidekiq错误队列:打开Sidekiq Web面板,检查「重试」「死信」标签下是否有相关任务,可查看具体报错信息(常见为SMTP服务配置错误、邮件模板渲染错误)
- 验证同步投递是否正常:在Rails控制台执行以下命令,确认邮件同步发送逻辑无问题:
# 测试Devise重置邮件同步发送 User.find(2).send_reset_password_instructions # 直接测试邮件服务连通性 Devise::Mailer.reset_password_instructions(User.find(2), "test_token").deliver_now
内容的提问来源于stack exchange,提问作者Humayun Naseer
相关产品推荐
相关产品推荐

