前提条件
・ruby 2.6.6
・rails 6.0.3.2
・macOS Catalina バージョン10.15.7
・deviseを使用
・herokuにデプロイ済み
概要
webアプリ作成中に、毎日決まった時間に特定の操作を実行させたいなと思い調べてみた。[1] gem whenever
・・・というものがあるらしく実装しようと思ったら、herokuではサポートされていないらしい。
[2] Herokuのアドオン"Heroku Scheduler"
・・・これを利用すれば、設定した時間にrakeタスクを実行させることができるという。
ということで"Heroku Scheduler"の実装手順を記していく。
addonのインストール
まずHeroku Schedulerを利用できるようにaddonをインストールします。 heroku addons:create scheduler:standard
Railsでrakeタスクを作成
Heroku Schedulerで実行させるタスクをRailsで書きます。 `lib/tasks/scheduler.rake`を作成しその中に書いていきます。desc "This task is called by the Heroku scheduler add-on"
task :test_scheduler => :environment do
puts "scheduler test"
puts "it works."
end
task :send_reminders => :environment do
reservations = Reservation.where.not(status: "complete").where(patern: "no")
reservations.each do |reservation|
if reservation.end_time - 1.day <= Time.new
user = User.find_by(id: reservation.user_id)
reservation.patern = "yes"
reservation.save
MessageMailer.send_when_update(user, reservation).deliver
end
end
puts "ended."
end
:test_scheduler
はタスクのテストのためのコード、
:send_reminders
は私のアプリ内に置き換えたコードです。ここは各自で書き換えてください。
タスクのテスト
正常にHeroku Schedulerが実行されているか、ローカルで確認します。heroku run rake test_scheduler
#結果
scheduler test
it works.
正常な動作が確認ができたら、
herokuにデプロイし、タスクを実行させるスケジュールを設定していきます。
ジョブのスケジューリング
タスクを実行させるスケジュールを設定をしていきます。herokuをwebで直接たたくか、もしくは下のコマンドをターミナルで叩いても開けます。heroku addons:open scheduler
Add Job
を押すと上記のような画面が出てくるので、
どの間隔でタスクを実行させるか、どのタスクを実行させるかを記入します。
ここでの注意点として、Heroku Schedulerは、UTC(世界協定)の時間であるので、日本との時差を考えて、実行したい時間の9時間前に時間を設定しないといけません。
実行させるコマンド ※各自タスク名は変えてください
bundle exec rake send_reminders
最後にSave Job
を押して完了となります。
参考サイト
https://devcenter.heroku.com/articles/scheduler