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

in cn •  7 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是什麼?

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

@linjiahung, 绝对的码字达人!

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