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