Rails6.1で新たに利用できるようになったRails.application.config.action_mailer.deliver_later_queue_name
という設定。
new_framework_defaults_6_1.rbに書かれている。
ドキュメントを確認すると、
https://railsguides.jp/configuring.html#config-action-mailer-deliver-later-queue-name
配信ジョブで用いるActive Jobキューを指定します。
と書かれています。どうやらconfig.active_job.default_queue_name
と似たようなことができるらしい。
config.active_job.default_queue_name
とはいえconfig.active_job.default_queue_name
もよくわかっていないので先にこっちを使ってみます。
まず適当にjobを作ってみます。
rails g job great
でjobを作成。jobの名前は適当。中身も適当。
class GreatJob < ApplicationJob
queue_as :default
def perform
queue_name
end
end
コンソールで実行
[1] pry(main)> job = GreatJob.new
[2] pry(main)> job.perform_now
Performing GreatJob (Job ID: 41bbe02a-203f-48b9-99fb-4025f2126086) from Sidekiq(default) enqueued at
Performed GreatJob (Job ID: 41bbe02a-203f-48b9-99fb-4025f2126086) from Sidekiq(default) in 0.14ms
=> "default"
Sidekiqのあたりは無視して、queue_nameはdefaultが出力されました。
シンプルなApplicationJob(ActiveJob::Baseを継承しただけのclass)だとこんな感じになります。
queue_asで:defaultが指定されているので当然default
config.active_job.default_queue_nameを変更
というわけでconfig.active_job.default_queue_name
を変更してみます。
queue_asがついているとdefaultになってしまうのでコメントアウトして
class GreatJob < ApplicationJob
# queue_as :default
def perform
queue_name
end
end
config.active_job.default_queue_nameでキューを指定
config.active_job.default_queue_name = :gorila
コンソールで実行
[1] pry(main)> job = GreatJob.new
[2] pry(main)> job.perform_now
Performing GreatJob (Job ID: 84d1755c-8ed0-4684-910b-9dd4d4e0dd52) from Sidekiq(gorila) enqueued at
Performed GreatJob (Job ID: 84d1755c-8ed0-4684-910b-9dd4d4e0dd52) from Sidekiq(gorila) in 0.17ms
=> "gorila"
なるほど確かにキューがconfig.active_job.default_queue_name
で指定したものになっています。
config.action_mailer.deliver_later_queue_name
というわけで本題のconfig.action_mailer.deliver_later_queue_name
おそらくActiveJobのdefault_queue_nameと同じことをActionMailerでやるんだろうという感じですが
また適当にmailerを作成
rails g mailer good
ちなみにApplicationMailerはこんな感じ
class ApplicationMailer < ActionMailer::Base
default from: 'gorila@example.com'
layout 'mailer'
end
mailerの中身は適当
普段は固有名詞でもない限りローマ字の変数は使いませんが、確認するだけなので...
class GoodMailer < ApplicationMailer
def good_mail(tekitou_mail_adress)
mail(to: tekitou_mail_adress, subject: 'キューを確認するよ!!')
end
end
deliver_nowだとjobが見れないのでdeliver_laterで実行
[1] pry(main)> good_mail_deliver = GoodMailer.good_mail('tekitou@example.com').deliver_later
Enqueued ActionMailer::MailDeliveryJob (Job ID: 28fb613b-2d98-42f3-8929-07960dac5085) to Sidekiq(gorila) with arguments: "GoodMailer", "good_mail", "deliver_now", {:args=>["tekitou@example.com"]}
=> #<ActionMailer::MailDeliveryJob:0x00007ff193de8320
@arguments=["GoodMailer", "good_mail", "deliver_now", {:args=>["tekitou@example.com"]}],
@exception_executions={},
@executions=0,
@job_id="28fb613b-2d98-42f3-8929-07960dac5085",
@priority=nil,
@provider_job_id="d72bfb25854d0e5ae2324be1",
@queue_name="gorila",
@timezone="Tokyo">
queue_nameはなんと"gorila"!?!?
さっきconfig.active_job.default_queue_name
で設定したキューです。
MailDeliveryJobでもactive_jobのdefault_queue_nameが使われるのか...(無知)
では満を辞してaction_mailer.deliver_later_queue_name
を設定します。
config.action_mailer.deliver_later_queue_name = :golden_lion_tamarin
ゴールデンライオンタマリンはオマキザル科ライオンタマリン属に分類されるサルです。グリザイアシリーズで存在を知りました。
いざ、実行!!
[1] pry(main)> GoodMailer.good_mail('tekitou@example.com').deliver_later
Enqueued ActionMailer::MailDeliveryJob (Job ID: f1af94c0-b5e6-4e2b-8f81-2be116a8b394) to Sidekiq(golden_lion_tamarin) with arguments: "GoodMailer", "good_mail", "deliver_now", {:args=>["tekitou@example.com"]}
=> #<ActionMailer::MailDeliveryJob:0x00007fa21d329d28
@arguments=["GoodMailer", "good_mail", "deliver_now", {:args=>["tekitou@example.com"]}],
@exception_executions={},
@executions=0,
@job_id="f1af94c0-b5e6-4e2b-8f81-2be116a8b394",
@priority=nil,
@provider_job_id="31263cbf67c9fcf5b611de20",
@queue_name="golden_lion_tamarin",
@timezone="Tokyo">
queue_nameがちゃんとgolden_lion_tamarinになっています。
このオプションがnilに設定されている場合、配信ジョブはデフォルトのActive Jobキューに送信されます(config.active_job.default_queue_nameを参照)
まあ結局、ドキュメントに書かれていることを時間をかけて確認しただけなんですが、ActiveJobやらmailerやらをあまり触ったことがないもので...
結論
rails6.0 => rails6.1のアップグレード時には、mailerで使うキューが自分の想定したものになっているかを確認すれば良さそう。
今まで:mailersを使っていたなら
config.action_mailer.deliver_later_queue_name = :mailers
にすれば良いし、個人開発だし:defaultでいいや、ってなるなら:defaultでも良さそう