[Rails]如何使用whenever gem 建立固定排程

in #cn7 years ago (edited)

最近被問到如何建立固定排程執行特定行為,一時答不上來該如何處理,所以實作之後紀錄了這篇內容。

以下以每天早上十點固定寄出電子報為例。

安裝whenever

首先安裝whenever

gem 'whenever', require: false

接著我們透過以下的指令建立config/schedule.rb

wheneverize .

schedule.rb這個檔案可以讓我們設定固定排程,我們稍晚會介紹更多如何使用schedule.rb

whenever預設接受以下四種job_type

  1. command
  2. rake
  3. output
  4. 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是什麼?

Sort:  

@linjiahung, 绝对的码字达人!

@linjiahung, 伦家就觉得你写得不错嘛~~~ img