0

我在 Heroku 上部署了一个 rails 应用程序。我想添加一项功能,使应用程序的用户能够设置提醒。我需要某种方式让应用程序安排在用户指定的时间发送电子邮件。

我发现很多帖子都提到为此使用delayed_job,但是我发现的任何文章/教程/等都没有直接解决我想要完成的事情(我发现的描述似乎更适合管理长期运行“随时”运行的作业)。

我在寻找延迟工作的正确轨道上吗?如果是这样,有人可以指点我一个可能对我有帮助的教程吗?

如果delayed_job 不太适合这份工作,有没有人建议我如何处理这个问题?

4

3 回答 3

2

处理此问题的最典型方法是使用 cron 作业。您安排一个作业每 15 分钟左右运行一次,并在此期间提供任何提醒。不幸的是,heroku 只允许 cron 作业每小时运行一次,这通常是不够的。

在这种情况下,我会使用delayedjob 并诱骗它设置一个重复任务,该任务会根据需要经常发送通知。例如,您可以创建一个函数,首先将自身重新安排为在 10 分钟内运行,然后继续发送在前 10 分钟内弹出的任何提醒。

要查看延迟作业的 send_at 语法以安排未来的作业,请在此处查看:https ://github.com/tobi/delayed_job/wiki

评论后添加:要发送提醒,您需要创建一个搜索待处理提醒并发送它们的函数。例如,假设您有一个名为 Reminder 的模型(rails 3 语法,因为我更喜欢它):

def self.find_and_send_reminders
 reminders = Reminder.where("send_at < ? AND sent = ?", Time.now, false).all
 reminders.each do |r|
   #the following delayed_job syntax is apparently new, and I haven't tried it.  came from the collective_idea fork of delayed_job on github
   Notifier.delay.deliver_reminder_email(r)
   #I'm not checking to make sure that anything actually sent successfully here, just assuming they did.  may want to address this better in your real app
   r.update_attributes!(:sent => true)
 end
 #again using the new syntax, untested.  heroku may require the old "send_at" and "send_later" syntax
 Reminder.delay(:run_at => 15.minutes.from_now).find_and_send_reminders
end

此语法假定您决定对每个发生方法使用单个提醒条目。如果您决定对所有重复提醒使用单个条目,您可以创建一个类似“last_sent”的字段,而不是“sent”的布尔值并使用它。请记住,这些都只是想法,我实际上还没有花时间来实现这样的东西,所以我可能还没有考虑所有的选项/问题。

于 2010-08-31T07:13:03.863 回答
1

查看 runt gem,可能对您有用:http ://runt.rubyforge.org/

于 2010-09-04T04:13:05.140 回答
0

您可以使用delayed_job 的run_at 来安排在特定时间而不是任何时候。

如果您的应用程序允许用户更改提醒的时间,您需要记住延迟作业才能在需要时更新或删除它。

这里有更多细节。

如果可以的话,最好避免轮询。工作线程将在数据库级别进行轮询,您不想在轮询之上添加轮询。

于 2011-03-15T00:48:11.670 回答