Webuilder240

ActionMailerのdeliver_laterのバックエンドを変更する

2022-12-27 22:57:50 +0900

ActiveJob ActionMailer Rails Ruby
ふと思い出した小ネタです。

ActionMailerのdeliver_laterメソッドを使うとActiveJobを経由してメールが配信されるわけですが、
ActiveJobを動かすキューシステムは普段はDelayedJobだけど、メール配信はSidekiqで動かしたい!!
そんなことないでしょうか?僕はあったので対応しました。

対応方法

1. メール配信するためのActiveJobクラスをActionMailer::MailDeliveryJobというクラスを継承して作ります。ここではGeneralMailJobというJob名にしています。そして、queue_adapterにsidekiqを設定しておきましょう。

class GeneralMailJob < ActionMailer::MailDeliveryJob
  self.queue_adapter = :sidekiq
end

2. すべてのメール配信をGeneralMailJobで動かしたいので、ApplicationMailerにdelivery_jobを設定しましょう。
class ApplicationMailer < ActionMailer::Base
  self.delivery_job = GeneralMailJob
end
これで対応完了です。
queue_adapterの変更だけではなく、
もし特定のメール配信だけを優先度を上げたいとか、別のWorkerで対応するみたいなことも、ActionMailer::DeliveryJobを継承したActiveJobクラスを変更したいActionMailerのdeliver_jobを変更してあげれば対応可能です。

こういった対応はできないと思ったので、
DelayedJobからSidekiqへの段階的な移行がこれでできるのでとても助かりました。

関連しそうなブログ