覚書: Rails: Action Mailer の deliver_later
Action Mailer の deliver_later(メールキューにメールを登録)についての覚書です。
本題に入る前に
リクエスト-レスポンスのサイクル
URL を開くと Controller が View を返す。
メール送信
Mailer の deliver_now 呼ぶと、メールを送信する。
Mailer はグローバルIDで Model を参照できる。
ジョブ
Job は Controller とは別スレッドまたは別プロセスで動く。
Job はクラス名で自身を永続化する。
Job もグローバルIDで Model を参照できる。
deliver_later
デフォルトで MailDeliveryJob を使う。
MailDeliveryJob
Mailer のクラス名と Model のグローバルIDを永続化する。
Job 自身クラス名で永続化している。
後日、Visual Studio Code でデバッグ実行して動作確認してみました。
以下、コードを読んだ際のメモ。
ActionMailer::MessageDelivery
https://github.com/rails/rails/blob/7-0-stable/actionmailer/lib/action_mailer/mail_delivery_job.rb
deliver_later
https://api.rubyonrails.org/classes/ActionMailer/MessageDelivery.html#method-i-deliver_later
def deliver_later(options = {})
enqueue_delivery :deliver_now, options
end
def enqueue_delivery(delivery_method, options = {})
@mailer_class.delivery_job.set(options).perform_later(
@mailer_class.name, @action.to_s, delivery_method.to_s, args: @args)
以下、本件とは直接関係ありませんが興味深い内容だったのでメモ。
Action Mailerのdeliver_laterにみるRubyのDelegatorの仕組み | Wantedly Engineer Blog
RuntimeError: You've accessed the message before…の箇所も気になったのですが読むと時間がかかりそうだったので助かりました。感謝。
Hangfireで実現する.NETアプリのバックグランドジョブ - 一休.com Developers Blog
静的型付け言語での実現方法が気になったので参考になりました。感謝。
以上です。
この記事が気に入ったらサポートをしてみませんか?