賢くなりたいトイプードルの日記

データサイエンス系の話をメインにしていきます

Railsでメールの送信部分のエラーを解消したら溜まっていたメールが一気に送られる

コードに問題があってメールが送信されなくても、sidekiqにはジョブがキューにずっと溜まっている。

だからメールの送信部分にバグがあって、何日も経った後にふとメールが送られていないことに気がついてバグを修正すると、溜まっていたメールが一気に送られてしまい、受信者がびっくりしてサイバー攻撃を疑ったりしてしまう。

そんなことがあっては、信用を失ってしまう。
そこで、キューにたまったジョブを削除する必要がある場合がある。

※以下の記事を参考にさせていただいた。

Sidekiqで溜まっているジョブを確認したりキャンセルしたりする - Qiita

Sidekiqのジョブを削除する [Rails] - ノンカフェインであなたにやさしい

Sidekiqに溜まっているメールを確認・削除

ssh-add ~/.ssh/your_ssh_key_rsa
bundle exec cap production rails:console
ActiveRecord::Base.clear_cache!

で本番環境のコンソールを立ち上げ、 pry(main)> require 'sidekiq/api

pry(main)> require 'sidekiq/api'

これでキューやジョブに直接アクセスできるクラス群が使えるようになる

処理待ちのジョブを確認

pry(main)> Sidekiq::RetrySet.new.each { |job| puts  [job.jid, job.klass, job.args].join("\t") }

名前を指定したキューを使っている場合

pry(main)> Sidekiq::Queue.new('queue_name').each {|job|puts "#{job.jid} #{job.klass} #{job.args}"}

処理待ちのジョブを一つだけキャンセルする

pry(main)> Sidekiq::Queue.new.find_job('job_id/JID').delete

処理待ちのジョブを全てキャンセルする

pry(main)> Sidekiq::Queue.new.clear

リトライ待ちのジョブを一覧表示する
Sidekiqのジョブは一度失敗してリトライに回ると Sidekiq::Queue でfind_job できなくなってしまう。代わりに Sidekiq::RetrySet を使う。

pry(main)> Sidekiq::RetrySet.new.each {|job|puts "#{job.jid} #{job.klass} #{job.args}"}

リトライ待ちのジョブを1件削除

pry(main)> Sidekiq::RetrySet.new.find_job('job_id /JID').delete

リトライ待ちのジョブを全件削除

pry(main)> Sidekiq::RetrySet.new.clear