絵文字の力でSidekiqの全キューを一括クリアする方法
Honeybadgerでは日頃からSidekiqを多用しており、その利便性には大いに助けられています。しかし、開発作業の中で何度も遭遇する厄介な問題がひとつあります。
開発中に溜め込まれたジョブの問題
実は私は、開発環境では普段Sidekiqを起動していません。ところが手動テストを進める過程で、気づけば大量のジョブがキューに登録されてしまいます。そして次にSidekiqを起動したとき、それらの古いジョブをすべて処理しようとしてしまうのです。これは困りものです。
特定の1つのキューからジョブを削除するコードスニペットなら、検索すればすぐに見つかります。しかし、私たちのアプリケーションには多数のキューが存在しており、そのすべてからジョブを一括でクリアしたいのが本音です。少し調べてみたところ、うまく機能する答えに行き着きました。ご覧ください!
# 最初はもっと冗長なコードでしたが、Sidekiq作者のmperham氏に教えてもらい、シンプルになりました :)
Sidekiq::Queue.all.each(&:clear)
より直接的な実装方法もありますが、このコードはSidekiqの公開APIで定義されたメソッドのみを使用している点がポイントです。そのため、ライブラリの内部実装が変更されても、動作し続けられる可能性が高いといえます。
絵文字パワーでさらに楽しく!
Sidekiqのソースコードを注意深く読んでみると、なんと💣(爆弾)の絵文字でclearメソッドを呼び出せることに気づきます。冗談ではなく、実際に存在するコードです。
# https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/api.rb#L255
alias_method :💣, :clear
これを踏まえると、「全キューをクリアする」コードは次のように書き換えられます。
Sidekiq::Stats.new.queues.each { |k, v| Sidekiq::Queue.new(k).💣 }
せっかくなので、独自の💀(ドクロ)メソッドを定義して、全キューの一括削除をひとつのメソッド呼び出しで実行できるようにしてみましょう。
def 💀
Sidekiq::Stats.new.queues.each { |queue_name, _| Sidekiq::Queue.new(queue_name).💣 }
end
まとめ
Sidekiq::Queue.all.each(&:clear)を使えば、公開APIだけで全キューのジョブを安全にクリアできます。また、Sidekiqには遊び心あふれる絵文字エイリアスが組み込まれているのも面白いところです。ただし、本番環境で実行すると処理待ちのジョブが失われてしまうため、実行するのは開発環境に限定することをおすすめします。
-
HTMLフォームの入力内容をすべてリセットする方法【初心者向け】
HTMLフォームを使えば、ユーザーからの入力を簡単に受け取ることができます。<form>タグの中に各種フォーム要素を配置することで、ユーザー入力を受け付ける仕組みを作れます。フォーム要素には、テキスト入力欄、ラジオボタン、送信ボタンなど、さまざまな種類があります。ユーザー入力を受け取るには、<input>タグを使用し、type属性で入力形式を指定します。そして、フォーム内のすべての入力内容を一括でクリアしたい場合は、type=reset を指定した<input>タグを追加するだけで実現できます。resetボタンがクリックされると、そのフォーム内の全テキストフ
-
Macを使ってiPhoneの写真をすべて一括削除する方法
iPhoneの高品質カメラなら、思いつくままにたくさんの写真を撮るのはとても簡単です。しかし、撮った写真を管理するのは同じくらい大変な作業です。特に16GBモデルのiPhoneをお使いの方は、ストレージ容量不足に悩まされることが多いのではないでしょうか。 そんなときは、不要な写真をiPhoneから削除して空き容量を確保しましょう。もしMacをお持ちで、MacとiPhoneの両方でiCloud写真が有効になっている場合は、写真はすべてクラウドにバックアップされ、両デバイス間でライブラリが同期されています。このケースでは、「最近削除した項目」フォルダを空にすることに集中するのが効果的です。そこに