1
0

More than 1 year has passed since last update.

Rails6.1の Rails.application.config.action_mailer.deliver_later_queue_name を試してみる

Last updated at Posted at 2023-03-01

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の名前は適当。中身も適当。

great_job.rb
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になってしまうのでコメントアウトして

great_job.rb
class GreatJob < ApplicationJob
  # queue_as :default

  def perform
    queue_name
  end
end

config.active_job.default_queue_nameでキューを指定

application.rb
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はこんな感じ

application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: 'gorila@example.com'
  layout 'mailer'
end

mailerの中身は適当
普段は固有名詞でもない限りローマ字の変数は使いませんが、確認するだけなので...

good_mailer.rb
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を設定します。

application.rb
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を使っていたなら

application.rb
config.action_mailer.deliver_later_queue_name = :mailers

にすれば良いし、個人開発だし:defaultでいいや、ってなるなら:defaultでも良さそう

1
0
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
1
0