はじめに
おはようございます。当ブログにアクセス頂き、ありがとうございます。最近プログラムばかり書いている、たなけんです。
本エントリではClojureのジョブスケジューラであるQuartziteを紹介します。
処理の全自動化のために
プログラムは日常のルーチンタスクを、嫌がることなく、また手動で処理するよりも正確かつ高速に処理してくれます。しかし、そのプログラムを起動するのは私自身だったりします。。。しかし、処理する情報が定型、処理頻度も定期的なタスクも少なからずあります。「ルーチンワークのために1分とも時間を使いたくない」というニーズから、ジョブスケジューラの調査をしてみました。
Quartziteとは
QuartziteとはClojure製のジョブスケジューラで、JavaのQuartz SchedulerのClojureラッパです。ジョブスケジューラにはcron(やエンタープライズ用途ではJP1)などがよく使われていますが、「Clojureでどこまでできるか」「ClojureでできることはClojureでやる」の旗印の基、Quartziteを使ってみることにしました。
ソースコード
基本的には、本家サイトの写経となります。プロジェクトファイル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defproject quart "0.1.0-SNAPSHOT" | |
:description "FIXME: write description" | |
:url "http://example.com/FIXME" | |
:license {:name "Eclipse Public License" | |
:url "http://www.eclipse.org/legal/epl-v10.html"} | |
:dependencies [[org.clojure/clojure "1.4.0"] | |
[clojurewerkz/quartzite "1.0.1"] | |
[liberator "0.5.0"]]) |
依存ライブラリに[clojurewerkz/quartzite "1.0.1"]を追記します。(liberatorはWebサービス用のライブラリ、本エントリでは特に利用しません。)
nsマクロ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns quart.core | |
(:require | |
[clojurewerkz.quartzite.scheduler :as qs] | |
[clojurewerkz.quartzite.jobs :as job] | |
[clojurewerkz.quartzite.triggers :as trg] | |
[clojurewerkz.quartzite.schedule.simple :as smp])) |
以下の4つの名前空間の関数(およびマクロ)を利用します。
- clojurewerkz.quartzite.scheduler: スケジューラそのもの
- clojurewerkz.quartzite.jobs: ジョブの組み立てに利用
- clojurewerkz.quartzite.triggers: トリガの組み立てに利用
- clojurewerkz.quartzite.schedule.simple: トリガの組み立てに利用できる便利な部品を提供。
ジョブの定義
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(job/defjob GreetJob | |
[ctx] | |
(println "Hi")) |
名前空間clojurewerkz.quartzite.jobsのdefjobマクロを用いてジョブを定義します。
ctxはコンテクストと呼ばれるオブジェクトで、別途用意された関数を用いてハッシュのようにキーに対応する値を取り出すことができます。
トリガーの登録
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defn -main | |
[& m] | |
(qs/initialize) | |
(qs/start) | |
(let [j (job/build | |
(job/of-type GreetJob) | |
(job/with-identity (job/key "jobs.greet.1"))) | |
tk (trg/key "triggers.1") | |
t (trg/build | |
(trg/with-identity tk) | |
(trg/start-now) | |
(trg/with-schedule (smp/schedule | |
(smp/with-repeat-count 10) | |
(smpwith-interval-in-milliseconds 200))))] | |
(qs/schedule j t) | |
(qs/unschedule-job tk))) |
- 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 件のコメント:
コメントを投稿