2011-05-22 54 views
5

我使用ResqueRedis来处理后台作业。我想每小时调用一次Resque.enqueue(MyModel)方法来完成后台任务。如何在Rails中每小时调用一次方法?

例如:假设我有一个拥有10,000个用户的网站。我想每天只调用这种方法24次;不是10,000 * 24.示例方法如下:

Resque.enqueue(MyModel) 

感谢您提前给予的帮助。我还应该提到,我更喜欢坚持Resque,而不是转向延迟工作。谢谢。

+0

无限while循环,先调用方法再睡3600秒? – 2011-05-22 23:05:34

+0

你会怎么敢:)这里有专门的工具! – apneadiving 2011-05-22 23:07:16

+0

@apneadiving tbh,在这种简单的情况下(特别是在需要访问对象的地方),我会尽可能地设置一个cron作业。 – 2011-05-22 23:08:20

回答

5

您应该为这类任务使用cron作业。

我建议你使用每当宝石。

railscast,请参阅:http://railscasts.com/episodes/164-cron-in-ruby

+0

我正在看railscast#164和每当宝石看起来不错。你对这个宝石有很多很好的经验吗?我应该考虑什么否定? – 2011-05-22 23:12:52

+0

不,它很棒,让你按照适当的周期安排你需要的任何东西 – apneadiving 2011-05-22 23:13:56

+0

Cron作业不是Rails的特定选项。他们用于维护等... – apneadiving 2011-05-22 23:16:18

3

既然你已经使用Resque,我会建议使用许多可用Resque插件之一:resque-scheduler。插入Resque UI也非常好。简单设置,如自述文件中所述。还增加了很多缺少的DelayedJob内容(延迟执行)。在应用程序文件夹

  • ,但不会变成惹你的cron文件:

    为什么我从whenever切换到resque-scheduler

  • 要停止所有'crons',只需禁用Resque工作。
  • 将异常记录到Resque UI。
  • 可通过Resque UI手动重新安排。
  • resque-loner组合使用时,如果作业花费的时间比两次执行之间的时间长,则可以防止执行双重执行。
  • 仍然服从Resque的优先权系统。
  • 由于使用了Resque的工作池,因此无需额外的启动时间(如果您的应用程序变得更大,可能需要60秒)。
  • 使用了少一个“技术”。
  • 简单开关:配置以类似cron的方式完成。
+0

+1,因为它看起来像不会每5分钟运行一次rake测试的环境启动时间等。这对我们来说是一个巨大的胜利,有很多后台任务。 – d11wtq 2011-05-22 23:46:03

0

你可以很容易地使用Whenever这正是你要求和更多,它有一个非常好的文档。

你可以使用一些语法如下:

every 3.hours do 
    runner "MyModel.some_process" 
    rake "my:rake:task" 
    command "/usr/bin/my_great_command" 
end 

使用安装:

$ gem install whenever 

或将其添加到您的Gemfile:

gem 'whenever', :require => false 

然后运行:

$ cd /apps/my-great-project 
$ wheneverize . 

希望这可以帮助你!

相关问题