LoginSignup
4
4

More than 5 years have passed since last update.

Herokuで遅延処理(DelayedJob)を実装/設定する

Last updated at Posted at 2019-01-20

今回想定しているのは、ユーザーが立てた予定(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

まとめ

思ってたよりも作業が少なかったけど、無事に遅延処理できました。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4