最近被問到如何建立固定排程執行特定行為,一時答不上來該如何處理,所以實作之後紀錄了這篇內容。
以下以每天早上十點固定寄出電子報為例。
安裝whenever
首先安裝whenever
gem 'whenever', require: false
接著我們透過以下的指令建立config/schedule.rb
wheneverize .
schedule.rb這個檔案可以讓我們設定固定排程,我們稍晚會介紹更多如何使用schedule.rb
whenever預設接受以下四種job_type
- command
- rake
- output
- runner
接下來我們會聚焦於使用rake來幫助我們撰寫排程。
建立rake指令
首先在lib/tasks下建立一個daily_routine.rake,接著建立一個task。
desc "A task used for sending daily mail"
task :send_daily_mail do
DailyMailer.send_notification.deliver_later!
end
當我們執行bundle exec rake send_daily_mail RAILS_ENV=your_environment就可以觸發這個task。
建立Mailer
在app/mailer下建立一個daily_mailer.rb的檔案。
接著我們定義一個send_notification method。而我們預期當我們觸發這個方法時,我們能夠寄信給所有的使用者。
class DailyMailer < ApplicationMailer
def send_notification
default to: -> { User.pluck(:email) },
default :from "[email protected]"
mail(
subject: "「電子報」"
)
end
end
設定schedule.rb
接著讓我們來設定我們的schedule.rb。
因為我們預期是每天的早上十點會觸發固定寄信這個行為,所以我們在schedule.rb裡做以下的設定
set :output, "log/cron_log.log"
env :PATH, ENV['PATH']
set :environment, :development
every 1.day, at: '10:00' do
rake "send_daily_mail"
end
set :ouput, "log/cron_log.log"
這段指令可以讓我們把log存在log/cron_log.log這個檔案中
set :PATH, ENV['PATH']
這段指令確保你可以載入正確的路徑
set :environment, :development
whenever預設的環境是production,如果你有想要指定的環境,可以透過這個指令設定
執行週期性任務
接著我們要開始執行我們的固定排程,在console執行以下的指令
$ whenever -i
=> [write] crontab file updated
這個指令會更新crontab
接著下
$ whenever -w
[write] crontab file written
這樣我們的排程就可以開始執行了。
你也可以透過以下的指令列出目前所有的排程
$ crontab -l
到這裡基本上整個流程就結束了。
疑難排解
如果你的排程沒有正常執行,你可以到log/cron_log.log來檢視是否有錯誤訊息。
Whenever Gem
ActionMailer Basics:2.3.3 Sending Email To Multiple Recipients
Rails Gem开发(二)——whenever实现周期性任务
[Rails]Whenever 使用筆記
Rails cron whenever, bundle: command not found
Rails: 使用 Whenever 產生 Cronjob
在Ruby和Rails中的Rake是什麼?
@linjiahung, 绝对的码字达人!
@linjiahung, 伦家就觉得你写得不错嘛~~~