2012年10月16日火曜日

ジョブのスケジューリング: Quartzite

はじめに

おはようございます。当ブログにアクセス頂き、ありがとうございます。
最近プログラムばかり書いている、たなけんです。
本エントリではClojureのジョブスケジューラであるQuartziteを紹介します。

処理の全自動化のために

プログラムは日常のルーチンタスクを、嫌がることなく、また手動で処理するよりも正確かつ高速に処理してくれます。しかし、そのプログラムを起動するのは私自身だったりします。。。
しかし、処理する情報が定型、処理頻度も定期的なタスクも少なからずあります。「ルーチンワークのために1分とも時間を使いたくない」というニーズから、ジョブスケジューラの調査をしてみました。

Quartziteとは

QuartziteとはClojure製のジョブスケジューラで、JavaのQuartz SchedulerのClojureラッパです。
ジョブスケジューラにはcron(やエンタープライズ用途ではJP1)などがよく使われていますが、「Clojureでどこまでできるか」「ClojureでできることはClojureでやる」の旗印の基、Quartziteを使ってみることにしました。

ソースコード

基本的には、本家サイトの写経となります。

プロジェクトファイル


依存ライブラリに[clojurewerkz/quartzite "1.0.1"]を追記します。(liberatorはWebサービス用のライブラリ、本エントリでは特に利用しません。)

nsマクロ


以下の4つの名前空間の関数(およびマクロ)を利用します。

  • clojurewerkz.quartzite.scheduler: スケジューラそのもの
  • clojurewerkz.quartzite.jobs: ジョブの組み立てに利用
  • clojurewerkz.quartzite.triggers: トリガの組み立てに利用
  • clojurewerkz.quartzite.schedule.simple: トリガの組み立てに利用できる便利な部品を提供。


ジョブの定義


名前空間clojurewerkz.quartzite.jobsのdefjobマクロを用いてジョブを定義します。
ctxはコンテクストと呼ばれるオブジェクトで、別途用意された関数を用いてハッシュのようにキーに対応する値を取り出すことができます。

トリガーの登録



  • qs/initialize関数: スケジューラを初期化する
  • qs/start関数: スケジューラを起動する
  • job/buildマクロ: ジョブクラスおよびスケジューラ内で参照されるキーを付与してジョブを組み立てる
  • job/of-type関数: ジョブクラスをjob/buildマクロに与える
  • job/with-identity関数: ジョブキーをjob/buildマクロに与える
  • job/key関数: 文字列をジョブキーに変換する
  • trg/kye関数: 文字列をトリガキーに変換する
  • trg/buildマクロ: トリガ情報およびスケジューラ内で参照されるキーを付与してトリガを組み立てる
  • trg/with-identity関数: トリガキーをtrg/buildマクロに与える
  • trg/start-now関数: トリガを即座に有効化する(trg/start-at関数であれば、ある時間からトリガが有効になるところ)
  • trg/with-schedule関数: 引数のスケジュールをトリガとする
  • smp/scheduleマクロ: 名前空間clojurewerkz.quartzite.schedule.simpleに定義されている部品からスケジュールを組み立てる
  • smp/with-repeat-count関数: 繰り返し回数を指定する
  • smp/with-interval-in-milliseconds関数: インターバルを指定する


やや冗長な記述となる点が気になったので、ソースを確認したところ、Quartz Schedulerのクラス構成に忠実にインターフェースを用意しているためだと分かりました。SeleniumのラッパであるWeb-diverのtaxi APIのように、一対一対応するインターフェースの上に、よく使う組み合わせで組み上げたインターフェースを用意すると、さらに使いやすくなるのではないか思いました。(使っていく中で、僕なりに用意してみようと思います)


さらに知りたいこと

ジョブスケジューラといえば、下記の機能も欲しいところ(無ければ作ればよいのですが。。。)

  • ジョブフローの分岐
  • ジョブのリカバリ
  • メール等での通知

その辺りの機能についても注目しながら、調査および開発を進めていこうと思います。

今回の作業は以上。最後までお読み頂き、ありがとうございました。
たなけん(作業時間30分)

0 件のコメント:

コメントを投稿