他的問題就是要花很多錢,因為clockwork佔一個work,delayed_job也佔一個worker,heroku上只要你打開worker就開始算錢,即使你一天才跑一次,也是一樣,所以我用了heroku scheduler來取代clockwork,要注意的是他是best-effort service也是就他在很少的情況下可能不會執行,所以如果在如果你要執行的功能非常重要,那還是乖乖付錢用clockwork吧!,參考這篇。
那delayed_job咧?
這時候就要用workless gem,他幫你在jobs都跑完的時候關掉worker,有jobs的時候打開worker,這樣就省了不少錢了,安裝方式看這裡。
從clcokwork到heroku scheduler
clockwork用一個根目錄下的clockwork.rb來把工作加入排程,heroku scheduler就不一樣了,他用的是task,像下面這樣子。
# lib/tasks/scheduler.rake desc "This task is called by the Heroku scheduler add-on" task :check_times => :environment do puts "Checking Time Left..." ActionController::Base::ApplicationController.new.check_times puts "done." end
特別要注意的是你的action是放在model裡面就可以像這樣叫他Model.check_times,但是如果是放在controller就要先建立instance才可以呼叫他,像上面寫的那樣,要有一個.new,接著執行下面的指令,再把每一個task輸入,舉例來說,上面的就要輸入rake check_times,時間到了就會自動把要執行的東西交給delayed_job了
heroku addons:open scheduler當你打開worker的時候你的heroku免費750小時就開始減少了,所以測試完記得關掉喔
附註
在delayed_job執行的action如果有flash的訊息的話,log會出現一堆錯訊訊息,因為沒有request有flash也沒用,只要把flash刪掉就沒事了,當初我找了一陣子才知道的說。
沒有留言:
張貼留言