ふと思い出した小ネタです。
ActionMailerのdeliver_laterメソッドを使うとActiveJobを経由してメールが配信されるわけですが、
ActiveJobを動かすキューシステムは普段はDelayedJobだけど、メール配信はSidekiqで動かしたい!!
そんなことないでしょうか?僕はあったので対応しました。
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への段階的な移行がこれでできるのでとても助かりました。
queue_adapterの変更だけではなく、
もし特定のメール配信だけを優先度を上げたいとか、別のWorkerで対応するみたいなことも、ActionMailer::DeliveryJobを継承したActiveJobクラスを変更したいActionMailerのdeliver_jobを変更してあげれば対応可能です。
こういった対応はできないと思ったので、
DelayedJobからSidekiqへの段階的な移行がこれでできるのでとても助かりました。