詰まったところ
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
することで解決しました。
みなさんの問題解決に繋がったら幸いです。