2013年8月17日 星期六

Rails排程工作套件 - whenever

專案中或多或少會需要排程的功能,不免俗的,Rails強大的生態圈中當然也出現了幾套好用的排程gem,其中最多人使用的就是「whenever」。

安裝

gem 'whenever', :require => false

其中":require => false"的變數是為了不讓這個gem被專案require,因為其實他本身並不會被專案所呼叫,那也就沒有必要被載入專案,佔用記憶體。

原理:
linux中本身就有排程的功能(參見鳥哥的linux私房菜),whenever只是以更親切的方式來提供開發者使用,但實際上還是由os來執行cronjob。


初始化

在專案底主目錄下:
wheneverize .
這樣會產生config/schedule.rb,我們需要在裡面設定隔多久執行特定的job。


設定cronjob

上一個步驟中產生的schedule.rb中其實已經有一些範例可以做參考,基本上格式就是:

every 1.day, :at => '4:30 am' do
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end

以上述程式碼來說,要執行的method就寫在my_model.rb中,這樣應該是足夠明瞭了。


最後一步

但可不是這樣就搞定了,因為對os來說,crontab中仍然沒有任何排程工作。可以用以下指令來檢視:
crontab -l
所以我們要先執行whenever的一段指令讓我們寫在schedule.rb的排程工作實際加到crontab中才行:
whenever --update-crontab store
這時我們再執行 crontab -l 就可以看到剛剛加入的行程了。