如何使用延迟的作业gem每x次运行n个作业?

时间:2011-10-18 14:39:49

标签: ruby-on-rails delayed-job

我的问题是如何使用延迟的作业gem每隔n秒运行x个工作量?

示例

我想发送大量的时事通讯。但是,当我发送#50(“示例”)邮件时,GMail不会发送电子邮件(垃圾邮件),但其内容有点不同。

因此,如果我每3分钟由20个用户组发送简报,GMail将正确发送电子邮件。

提前致谢

2 个答案:

答案 0 :(得分:4)

delayed_job有一个选项:run_at(https://github.com/collectiveidea/delayed_job),您可以使用它来设置作业应该运行的时间。它不能保证作业是否会在那时运行,但它肯定不会在此之前运行。

所以,20封邮件/ 3分钟= 1封电子邮件/ 9秒。

你可以做这样的事情:

now = Time.now
count = 0
# then for each newsletter schedule it at intervals of 9 secs
users.each do |u|
  WhateverMailer.delay(:run_at => now + count*9).news_letter(u)
  count += 1
end

答案 1 :(得分:1)

您可以使用SimpleWorker执行此类操作,SimpleWorker是一种基于云的计划和后台处理服务。它提供类似DelayedJob的功能,但无需管理服务器和队列。 (我在SimpleWorker的制造商Iron.io工作。)

您可以将作业计划为每X秒运行一次,或者计划多个作业在特定时间进入队列(不同的优先级具有不同的目标运行窗口)。您可能希望有一个或多个主要作业按常规计划运行,然后排队一个或多个从属作业以发送实际的电子邮件(每个都检查数据库以进行调度),而不是预先安排大量作业。下一组发送)。

在面对通过API获取数据的阈值时,您可以使用相同的方法。如果你愿意,很高兴进一步讨论。