詰まったところ
sidekiqで非同期にメール送信処理を実行する様に実装していたら、メール送信のジョブが待機状態のまま実行されない不具合に遭いました。
結論・解決方法
公式にある通り、以下のコードを実行。
https://github.com/mperham/sidekiq/wiki/Active+Job#action-mailer
$ bundle exec sidekiq -q default -q mailers
次に、deliverやdeliver_nowをdeliver_laterに変更。
deliver_laterとは、非同期にメール送信処理を行ってくれるメソッドである。
逆に、deliverとdeliver_nowは同期的にメール送信するメソッドである。
〇〇Mailer.deliver
〇〇Mailer.deliver_now
↓
〇〇Mailer.deliver_later
これで治るはず(知らんけど)。
もしDockerを使っていたら
sidekiqコンテナをビルドする際に以下コマンドを実行させる。
sidekiq:
command: bundle exec sidekiq -q default -q mailers
非同期処理を実装する前に
sidekiqでperform_asyncを使って非同期処理をする前に、まずは〇〇Mailer.new.performで同期処理ができるか確認しよう
そもそもとしてそのコードに不備がないかを確認しましょう(僕は不備がありました)。。。。
perform_asyncは非同期処理なので、binding.pryなどブレイクポイントを使うデバッグはできません。
なので、
〇〇Mailer.new.perform(args)
を実行して同期処理で正しく動作しているかを確認しましょう。
sidekiqのログを確認しよう
https://github.com/mperham/sidekiq/wiki/Monitoring#web-ui
sidekiqには、sidekiqで処理するジョブを閲覧できるダッシュボードを用意してくれています。
/sidekiqへアクセスすることで、ダッシュボードからエラーログの確認ができます。
エラーログを見ると、どの様なエラーが吐かれているかを確認できます。

sidekiqの処理に渡す引数のデータの型に気をつけよう
https://github.com/mperham/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple
sidekiqに渡す引数のデータ型には制限があります。
シンボル、名前付きパラメーター、複雑なRubyオブジェクト(Date型やTime型など)は使用できません。
使用できる引数のデータの型は、JSONのデータ型のみです。
JSONのデータ型は以下です。
- 文字列 ("...")
- 数値 (123, 12.3, 1.23e4 など)
- ヌル値 (null)
- 真偽値 (true, false)
- オブジェクト ({ ... })
- 配列 ([...])
僕は引数にDate型を渡していましたが、勝手にString型にされ他ので上記の様なエラーが起きました。
なので、Date型の引数をto_sで渡して、Worker内でto_dateすることで解決しました。
みなさんの問題解決に繋がったら幸いです。