[Rails]如何使用whenever gem 建立固定排程
最近被問到如何建立固定排程執行特定行為,一時答不上來該如何處理,所以實作之後紀錄了這篇內容。
以下以每天早上十點固定寄出電子報為例。
安裝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 "info@example.com"
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是什麼?
Leave [Rails]如何使用whenever gem 建立固定排程 to:
Read more #cn posts
Best Posts From linjiahung
We have not curated any of linjiahung's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.