BackgrounDRbによるタスクのスケジューリング方法まとめ

2010年5月追記 今使うならdelayed_jobとかResqueとかがいいっぽいです。今動いてるものはまだしも今から作るものでBackgrounDrbはやめた方がたぶん幸せになれます。

BackgrounDRbのスケジューリング方法いろいろいじってみたのでそのまとめ。

以下の三種類がある。

  • タイマーによるスケジューラ
  • Cronスタイルのスケジューラ
  • Unixスタイルのスケジューラ

タイマーによるスケジューラ

ワーカーのコードに書くタイプのスケジューラ。
ワーカーのメソッドでタイマーを設定できる。

メソッド 説明
add_timer(n) 与えたブロックをn秒後に1回だけ実行
add_periodic_timer(n) 与えたブロックをn秒ごとに実行

createでadd_periodic_timerを呼び出せば定期的に繰り返すバッチ処理などを行うことが可能。
コードに書くだけで設定できるのでお手軽と言えばお手軽。

add_timerは1回だけ実行される。
create以外の場所でも使うことができるので、何らかのタスクを行った一定時間後に後始末処理を行うとかいった使い方ができそう。

サンプルコード – lib/workers/foo_worker.rb

タイマーでログにタスク実行の日時を書き込むだけのサンプル。

class FooWorker < BackgrounDRb::MetaWorker
  set_worker_name :foo_worker
  def create(args = nil)
    add_timer(10) do
      logger.info "#{Time.now} - oneshot"
    end

    add_periodic_timer(1) do
      hello("#{Time.now} - repeated")
    end
  end

  def hello(message)
    logger.info message
  end
end

Cronスタイルのスケジューラ

設定ファイルであるconfig/backgroundrb.ymlに設定を書くタイプのスケジューラ。
crontabに書く形式でスケジュールを指定できる。

「:schedules:」というセクションを設定ファイルに追加して定義する。
具体的にどう書くかは言葉での説明がしんどいのでサンプルコード参照。

サンプルコード – config/backgroundrb.yml
:backgroundrb:
  :port: 11006
  :ip: 0.0.0.0

:schedules:
  :foo_worker:
    :hello:
      :trigger_args: 0 0 8 * * *
      :data: Hello from a cron style scheduler
    :good_night:
      :trigger_args: 0 0 22 * * *
      :data: Good night from a cron style scheduler at 22:00
    :good_night:
      :trigger_args: 0 0 20 * * *
      :data: Good night from a cron style scheduler at 20:00

ワーカー、タスク(メソッド)は複数書くことができる。
ただし同じタスクに関するスケジュール設定を複数書くことはできず、複数書くとエラーにはならないが一番最後に定義されたものだけが有効になる。
上の例だとgood_nightは20時タスクに実行される。

「:trigger_args:」にcrontabと同じ形でスケジュールを指定。
「:data:」はそのまま文字列としてタスクの引数になる。

Unixスタイルのスケジューラ

個人的にいまいちなじみがないけどUnixスタイルのスケジューラもある。
Cronスタイルのスケジューラと同じようにスケジューリングの設定をconfig/backgroundrb.ymlに書く。
設定ファイルにCronスタイルとUnixスタイルの書き方を共存させても問題はない。

:backgroundrb:
  :port: 11006
  :ip: 0.0.0.0

:schedules:
  :foo_worker:
    :hello:
      :trigger_args:
        :start: <%= Time.now + 1.second %>
        :end: <%= Time.now + 10.minutes %>
        :repeat_interval: <%= 3.seconds %>
      :data: Hello from a unix style scheduler

「:start:」の時間が来ると繰り返しがスタートし「:repeat_interval:」ごとに実行される。
「:end:」の時間が来ると繰り返しは終了。
「:start:」と「:end:」の間の時間よりも「:repeat_interval:」が長いとタスクは一度も実行されずに繰り返しは終了する。

スケジュールの書き方の他はCronスタイルのスケジューラと同じ。

参考

近況

しばらくバイクで放浪してました。明石焼きとか赤福とか食ってきました。
それにしても天気予報でエイプリルフールとか勘弁していだだきたい。しかも自分の走ってた地域だけピンポイントでとか。

BackgrounDRbによるタスクのスケジューリング方法まとめ” に対して2件のコメントがあります。

  1. manabe より:

    cronスタイルのスケジュールは下記の形式だと思いますよ。
    sec[0,59] min[0,59], hour[0,23], day[1,31], month[1,12], weekday[0,6], year

  2. akahige より:

    すみません、サンプルコードで初歩的なミスやってました。
    修正します。

    ご指摘ありがとうございます!

コメントは受け付けていません。