Resque 1.x系 のキューイング中のジョブ一覧を取得する

キューイング中のジョブ一覧はResqueモジュールのpeekメソッドを利用する。

GithubのResqueプロジェクトのソースを参照 github.com

peekメソッドは以下の3つの引数をとる。

  • 第1引数:一覧を取得したいキューの名前(Workerの@queueで指定するもの)
  • 第2引数:キューの情報を取得する位置を指定
  • 第3引数:第2引数で指定した位置から取得するジョブの数を指定

peekメソッドのソースには、 pagerと連携する為に利用できる旨がコメントとして記載されていた。

今回は任意のジョブ一覧ではなく全てのジョブ一覧が欲しいので、 第2引数に0、第3引数にはジョブの配列サイズを指定する。

以下サンプル。

_queue_name = "sample_queue"
queuing_jobs = Resque.peek(_queue_name, 0, Resque.size(_queue_name))
queuing_jobs = [queuing_jobs] unless queuing_jobs.instance_of?(Array)
queuing_jobs.each do |j|
  # ジョブに渡された引数の取得
  arg0 = j["args"][0]
  arg1 = j["args"][1]
  …

  # do something...

end

キューに存在するジョブが1件の場合、戻り値が配列ではなくなるので、 ジョブ一覧に対して反復処理をする前提の場合は、サンプルの様に必ず配列として扱えるように型を合わせるような工夫が必要。

もう少し細かい制御をしたい場合は、redisメソッドで取得できるredisのコネクションを利用する。 例えばキューイングされたジョブをピンポイントで取得したい場合は、 Resque.redis.lindex(インデックス番号)とインデックス番号(0から始まる正数)を指定すれば良い。