Rails 4.2.5 - ActiveJob 即使在指定 Deliver_later 之后也使用 Deliver_now
Posted
技术标签:
【中文标题】Rails 4.2.5 - ActiveJob 即使在指定 Deliver_later 之后也使用 Deliver_now【英文标题】:Rails 4.2.5 - ActiveJob using deliver_now even after specifying deliver_later 【发布时间】:2018-04-11 05:43:49 【问题描述】:我计划在 Rails 4.2.5 中使用 ActionMailer#deliver_later 异步发送邮件。
AppMailer 文件使用“邮件”通过邮件发送,我正在使用 Deliver_later,如下所示:
AppMailer.project_created_support_mail(@project).deliver_later
但是,日志显示传递的参数仍然是 'deliver_now'
[ActiveJob] [ActionMailer::DeliveryJob] [b341ea8c-ca96-4a4e-8079-572925864352] Performing ActionMailer::DeliveryJob from Inline(mailers) with arguments: "AppMailer", "project_created_support_mail", "deliver_now"
我假设没有明确需要附加像 Sidekiq 或 Resque 这样的队列。
有人可以帮助了解我在这里缺少什么吗?
编辑:我面临的最初问题是发送邮件的操作需要大约 5 秒,无论有无deliver_later。在尝试调试问题时,我发现参数仍然是“deliver_now”(上面的日志)。正如下面@torrocus 所指出的,'deliver_now' 在队列中被调用。但是,deliver_later 需要约 5 秒的问题仍然存在。
【问题讨论】:
如果是在生产或类似的,你是否重启了服务器? 尝试重启你的服务器。 我目前正在开发中试用它。问题是使用或不使用deliver_later 都需要大约5 秒的时间来传递邮件 【参考方案1】:当您调用#deliver_later
方法时,您将作业放入队列活动作业中。在队列内部,它调用#deliver_now
。
deliver_later (ActionMailer::MessageDelivery)
在开发中我建议使用 gem mailcatcher
【讨论】:
谢谢!这解释了日志。但是,无论是否使用 Deliver_later,每封邮件都需要大约 5 秒的时间来交付。知道为什么吗? 发送电子邮件总是需要一些时间。电子邮件是异步。建议在单独的队列中执行此类进程,以免阻塞应用程序。用户不应等待发送电子邮件。 这不是deliver_later的重点吗?还是我在这里遗漏了什么? 不完全是。deliver_later
- 电子邮件将通过 Active Job 发送。 deliver_now
- 发送电子邮件,但您应该记住此协议不能实时工作以上是关于Rails 4.2.5 - ActiveJob 即使在指定 Deliver_later 之后也使用 Deliver_now的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rails 控制台中运行 ActiveJob 进行调试?
SerializationError Rails ActiveJob 时间和日期
rspec rails testing:如何强制 ActiveJob 作业内联运行某些测试?
我应该在生产中使用 rails5 ActiveJob 默认异步适配器来进行小型后台作业吗?