RubyonRailsでBackgrounDRbを使って定期イベント、非同期処理を行う

開発環境はWindows、本番環境はLinuxであったために悲しいことになった。Windows上ではforkが動かない(実装されていない)ので、BackgrounDRbを稼動させると怒られてしまう。まぁコーディングだけしてテストサーバにアップ、テストというちまちましたことを繰り返せば済む話なので我慢しましょう。

では、まずはインストールから。

gem install chronic packet
ruby script/plugin install http://svn.devjavu.com/backgroundrb/trunk
rake backgroundrb:setup

インストールはコレだけです。BackgrounDRbはgemじゃなくて、Railsプロジェクとに対してインストールするということですね。複数のプロジェクトがあったら、それごとにインストールします。この場合、インストールという表現は不適切なんでしょうね。

rakeを実行するとBackgrounDRb用のマイグレーションファイルができあがっています。ジョブのキューを保存しておくためのモノっぽいです。これを実行しておかないとBackgrounDRbを起動させたときに怒られます。怒られてばっかりですね。

ruby script/generate worker hoge

これでhogeというworkerができます。中に「create」っていうメソッドがありますが、コンストラクタですね。自分でメソッドを追加します。ここで嬉しいのがActiveRecordやActionMailerが使えることでしょうか。まぁ当然なのですが、非常にありがたいです。


:backgroundrb:
  :ip: localhost
  :port: 11006
:schedules:
  :hoge_worker:
    :hogehoge:
      :trigger_args: 0 * * * * * *

backgroundrb.ymlに上記のように書いておくと、毎分0秒にHogeWorderのhogehogeというメソッドを実行してくれます。インターバルはcrontabと同じ書き方ですが、「秒」と「年」が増えています。「年」って使うのかなぁ。。。オリンピックリマインダー?

コントローラなどから処理を投げたいときには

MiddleMan.new_worker(:worker => :hoge_worker, :method_name => :hogehoge)

と記述します。もちろん引数も渡せます。

 ちなみに、BackgrounDRbは事前に起動しておく必要があります。リスナーが別スレッドで待っていて、それに対して処理を投げるようなイメージでしょうか。若干メモリが不安です。

ruby script/backgroundrb start
ruby script/backgroundrb stop

これで起動と終了です。複数同時起動はしません。

インストールの仕方等々、バージョンによって違いがあるような気がします。細かいところで悩んだことが多かったです。備忘録を兼ねて、同じことで悩んでいる方の助けになればと思います。