Action Job / Mailer的'deliver_now`和`deliver_later`

时间:2015-09-16 21:50:09

标签: ruby-on-rails jobs rails-activejob

在Rails中与ActionJob接口的常见模式是使用perform()方法设置作业,该方法通过perform_nowperform_later

异步调用

在Mailers的特殊情况下,您可以直接致电deliver_nowdeliver_later,因为ActionJobActionMailer完全整合。

rails documentation有以下评论 -

# If you want to send the email now use #deliver_now
UserMailer.welcome(@user).deliver_now

# If you want to send the email through Active Job use #deliver_later
UserMailer.welcome(@user).deliver_later

措辞似乎deliver_now使用ActiveJob发送邮件。这是正确的,如果是这样,deliver_nowdeliver_later之间的真正区别是什么?一个人不是异步的吗?

同样,同样的差异适用于perform_nowperform_later吗?

谢谢!

1 个答案:

答案 0 :(得分:19)

正如您在问题中所说,deliver_now不使用ActiveJob

基本上,deliver_later是异步的。当您使用此方法时,此时不会发送电子邮件,而是将其推送到作业的队列中。如果作业未运行,则不会发送电子邮件。无论工作状态如何,deliver_now都会立即发送电子邮件。 Here您可以看到deliver方法的文档。

根据您的第二个问题,perform_now将立即处理作业而不发送到队列。但是,perform_later会将作业添加到队列中,并且一旦作业的队列空闲,就会执行该作业。 Here您可以看到perform方法的文档。