今回想定しているのは、ユーザーが立てた予定(Plan)に対して、その予定日時の24時間前と1時間後に、ユーザーへの通知処理を行う(メールやLINEなど)というのもの。
遅延処理の仕組みにはRails標準のDelayedJobを使う。
Herokuの公式ドキュメントをみながら書きました。
https://devcenter.heroku.com/articles/delayed-job
環境設定編
1. gemを入れる
gem 'delayed_job_active_record' #Gemfileに追加
---
bundle install
2. delayed_jobを作成
rails generate delayed_job:active_record
rails db:migrate
jobはレコードとして保存されるので、マイグレーションを忘れずに。
Heroku用のProcfileを作成
Herokuではworkerを起動するためにProcfileが必要なので、作成します。
touch Procfile
---
worker: bundle exec rake jobs:work
実装編
1. 通知処理を作る
class Plan < ApplicationRecord
...
def pre_notify
# 事前に行う通知
...
end
def after_notify
# 事後に行う通知
...
end
end
2. 遅延させて実行する
メソッドを呼ぶ時に、クラス(インスタンス)とメソッド名の間にdelayを挟むと、workerへ処理が渡されます。
# scheduledカラムに予定日時がはいいている
# queueでキューのパラメータを渡せる
@plan = Plan.find_by(id: params[:id])
@plan.delay(run_at: @plan.scheduled - 24.hours, queue: 'plan_' + @plan.id.to_s).pre_notify
@plan.delay(run_at: @plan.scheduled + 1.hours, queue: 'plan_' + @plan.id.to_s).after_notify
まとめ
思ってたよりも作業が少なかったけど、無事に遅延処理できました。