はじめに
おはようございます。当ブログにアクセス頂き、ありがとうございます。最近プログラムばかり書いている、たなけんです。
本エントリでは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 件のコメント:
コメントを投稿