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 默认异步适配器来进行小型后台作业吗?

Rails ActiveJob - 如何阻止作业在 before_enqueue 中排队

执行 Job 时 Rails ActiveJob SQS 和记录仍然不存在