Rails で cron を使わずに cron っぽいことを行う方法

河野です! 今回は、 Rails で cron を使わずに cron っぽいことを行う方法をご紹介します! cron が使えないというケースはあまりないかもしれませんが、知っているといつか役に立つかもしれません。

poormans_cron プラグインを使う

poormans_cron というプラグインを使うと、 cron を使わずに cron っぽいことができるようになります。 poormans_cron は指定した間隔毎に任意の処理を実行するためのプラグインです。 また、基本的に cron は分単位からの指定しかできませんが、 poormans_cron では秒単位で処理の起動間隔を指定することができます。

仕組み

poormans_cron の仕組みはとても簡単です。 poormans_cron をインストールするとコントローラーにフィルターが一つ追加されます。 そのフィルターで、poormans_cron に事前に登録しておいた処理が定期的に実行されます。 この処理はコントローラーとは別のスレッドで実行されるので、リクエストを行ったユーザーが poormans_cron の処理が終わるまで待たされるということはありません。

インストール方法

./script/plugin install git://github.com/jugyo/poormans_cron.git

使い方

テーブルの作成

まず、 以下のようなテーブルを作成します。

create_table :poormans_crons, :force => true do |t|
  t.column :id,           :integer
  t.column :name,         :string
  t.column :interval,     :integer
  t.column :performed_at, :datetime
end

cron の作成

poormans_cron で定期的に処理を実行するには、 事前に poormans_crons テーブルに cron データを作成しておく必要があります。 cron に必要な情報は以下の二つです。

  • cron を識別するための名前
  • 実行間隔(何秒毎に処理を実行するのか)

例えば、1時間毎に処理を実行する cron を作成したい場合は以下のようにします。

PoormansCron::Cron.create(:name => 'hourly', :interval => 60 * 60)

cron データの作成にはマイグレーションを使うと良いと思います。

cron への job の登録

cron に実行してもらいたい処理(job と呼びます)を登録するには以下のようにします。

PoormansCron::Cron.register_job(:hourly) do
  # do something
end

register_job メソッドに渡すブロックの中に job の処理を記述します。

この設定は config/initializers/poormans_crons.rb 等に書いておくと良いと思います。

以上で poormans_crons の設定は完了です。

まとめ

とあるプロジェクトで必要にせまられてこのプラグインを作りました。 秒単位で処理の起動間隔を指定できるので、場合によっては cron よりも便利かもしれません。 また、デーモンの代わりに使うのも良いかもしれません。 ただし、当然ながらユーザーのアクセスがないと何も実行されません。

poormans_crons のソースは Github に置いてあります。

http://github.com/jugyo/poormans_cron

要望やバグ等があれば報告していただけると有り難いです!

Posted by Kazuyuki Kohno on Sunday, December 20, 2009