読者です 読者をやめる 読者になる 読者になる

ここにタイトルが入ります

デザイン&プログラミングのことも書くし、それ以外のことも書く。

【Rails】resque-schedulerでschedule・Delayedジョブを追加とか取得とか削除する。

Rails

Railsアプリケーションで何かバックグラウンドで
処理を実行させたい場合に便利なのが
resqueですね!


ユーザーの登録が済んだらメールを送るとか、
データの変更があったら集計し直すとか、
そんな時に使うことが多いと思います。


で、バックグラウンドで実行するタスクをcronみたくスケジュールリングしておいたり、
予定したタイミングで実行させることが出来るのが
resque-schedulerですね!!


そのスケジュール等を登録する方法を忘れてしまわないよう
今回書いてみました。


※↓に書いてあることを使ってみただけの話ですので
 そっち参照してもらえれば問題ないかと(^_^;)

〜参考になりました!〜

scheduler

定期的に実行されるジョブをスケジューリングしてくれる機能です。
実行時間とジョブを設定しておくと、決まった時間にジョブがキューに登録されて実行されるわけですね。


予め予定されているものを登録する場合は、
yamlに書いてrakeタスク実行するだけで一括登録出来ます。
そこは割愛。

セット
#1つ目の引数にジョブ名、2つ目のハッシュにその他設定が出来ます。
# 実行時間の指定はcronと同じように書けます
Resque.set_schedule('ジョブ名', 
                              { :cron => '0 14 * * *', 
                                :class => 'resque workerクラス名', 
                                :queue => 'キューの種類', 
                                :args => '引数', 
                                :description => '説明' }
                            )


# 時間の指定ですが、たとえは毎時15分?に実行する場合はeveryとかでも記述できるみたい
# 試してないですし他にどういう書き方があるのかは調べてません…
Resque.set_schedule('ジョブ名', 
                                  { :every => '15mins', 
                                    :class => 'resque workerクラス名', 
                                    :queue => 'キューの種類', 
                                    :args => '引数', 
                                    :description => '説明' }
                                )
取得
# 2013/05/29追記
# ↓すみません、'get_'が抜けていました…

# 登録されているスケジュール一覧
Resque.get_schedules                 

# で特定のジョブが取得出来ます
Resque.get_schedule("ジョブ名")  
削除
Resque.remove_schedule("ジョブ名")

delayed

scheduleが定期的なジョブだとして、delayedは1回だけの物と考えればいいのでしょうか?
delayedにジョブを設定しておくと、設定時間に到達した時ジョブがqueueに加わり
delayedからは削除されると。

追加
# 引数の1つめは実行時間(UNIX時間で指定??)、次のハッシュがその他設定内容
Resque.delayed_push(5.days.from_now.to_i,
                                   { :class => 'resque workerクラス名',
                                     :args => 'hoge' }
                                 )

キーがタイムスタンプ(UNIX時間でやり取りしなきゃいけないのかな?)になっています。

取得
# 次に予定されているdelayedジョブ
Resque.next_delayed_timestamp #=> タイムスタンプが返ってきます

# 特定のdelayedジョブの情報
Resque.next_item_for_timestamp("タイムスタンプ") #=> 詳細がハッシュで返ってきます

# 全delayedジョブの取得(delayed_queue_peek(start,count))
Resque.delayed_queue_peek(0,6)
  #=> インデックスで取得範囲を指定すると、
  #=> 該当するジョブのタイムスタンプが配列で返ってきます


delayedジョブをまとめて取得する際は取得範囲を指定しなければいけないので、

Resque.delayed_queue_schedule_size

で個数を調べてから取得するのがいいですかね。
単純に全部取得メソッドがないのは、redisの仕組みの関係なのでしょうか?


…で、ちょっと今回削除の仕方がわからなかったんですよねぇ…
削除は
remove_delayed_job_from_timestamp(timestamp, klass, *args)
でいけるみたいなんですけど、2つ目以降の引数に何渡せばいいのか…

たまにklassって出てくるんですけど私未だに何のことか知らないんですよね…(´ω`)
ちょっとそれ調べてから書きます…



ちょっとぐちゃぐちゃしてますがとりあえず。