2011-05-22 66 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 . 

希望這可以幫助你!

相關問題