オープンソースのジョブ管理システム「SOS JobScheduler」を理解するためのポイント

JobSchedulerの記事も3本目。

第1回はJobSchedulerの機能をざっくり紹介しました。

第2回の前回はインストールについて書きました。

JobSchedulerに関する日本語の記事はなかなかないこともあって、アクセス数を見る限りでは好評なようです。JobSchedulerの本拠であるドイツからのアクセスも来ていました。

第3回となる今回は、いざ使うにあたって、理解しておいた方が良いことを書いておこうと思います。

JobSchedulerの基本構造

JobSchedulerにはいろいろな機能があるので、それをすべて理解しようというのはなかなか困難です。(私もすべての機能を把握しているわけではありません。)
とりあえず最低限のところを知って、JobSchedulerの基本的な機能を使おうと思ったら、下図は理解しておきたいところです。

JOEとJOCは、前回の記事(インストール編)で紹介しました。JOEでジョブを設定して、JOCでジョブの実行を制御したり実行結果を参照することが出来るのでした。

まず、JOE(JobScheduler Object Editor)はJava Swingアプリケーションで、LinuxやWindowsなどで動作します。JobSchedulerの設定ファイルはXML形式になっているので、JOEはGUIでジョブの設定をした後、XML形式のファイルを書き出します。

ファイルは基本的にはLiveディレクトリに書き出すようにします。Liveディレクトリは標準インストールでは、/home/実行ユーザ名/sos-berlin.com/jobscheduler/scheduler/config/liveにあり、インストール時にサンプル設定の導入を有効にしていれば、sosというディレクトリが存在していると思います。
このLiveディレクトリに保存したファイルは、JobSchedulerが起動していれば自動的に読み込まれます。

次に、JOC(JobScheduler Operations Centre)を開いてみてください。http://localhost:4444などで開けると思います。JOCはJavaで出来たWebアプリケーションです。Jobタブの中身を見ると、Liveディレクトリと同じ構成のツリーが表示されているでしょう。デフォルトでインストールされているサンプル設定が既にJobSchedulerに読み込まれ、動作しているわけです。

JobSchedulerはジョブの実行状況を示す情報や実行結果、ログをデータベース(MySQL)に保存します。JobSchedulerを使うだけならMySQLの中身を覗く必要はありませんが、JobSchedulerを中核に据えて業務アプリケーションを作ろうとするなら、データがMySQLに格納されていることは重要でしょう。

また、JobSchedulerはコマンドラインでジョブの実行を制御したり、XML形式のコマンドをTCPの4444番ポートに送り込むことで同様の制御を行うことが出来ます。この辺も、業務アプリケーションを作る上で重要な機能となります。

ジョブとジョブチェーン、さらにオーダー

JobSchedulerのジョブには、スタンドアロンジョブ(Standalone Job)とオーダージョブ(Ordered Job)の2種類があります。スタンドアロンジョブは後で説明するジョブチェーン(Job Chain)に組み込むことが出来ません。オーダージョブはジョブチェーンに組み込むことができます。
つまり、この2つは両極端なのです。ただ、JOEで(もちろんXMLファイルを直接編集しても)簡単にスタンドアロンジョブとオーダージョブを切り替えることが出来ます。

ジョブチェーンは、複数のオーダージョブを束ねたもので、基本的には組み込まれたオーダージョブを順に実行します。ジョブチェーンが全体の処理(ジョブ)の流れを制御して、オーダージョブが個別の処理(ジョブ)を実行するといったイメージが持てれば良いでしょう。
また、ジョブチェーンは、ジョブ(オーダージョブ)の実行結果が成功か否かによって、次に実行するジョブ(オーダージョブ)を切り替えるといった設定を行うことが出来ます。(成功・失敗だけでなく、複数の結果を制御する機能もあります)

オーダーはジョブチェーンの実際の実行設定です。例えばあるジョブチェーンを違うパラメータで2つ起動したい場合は、2つのオーダーを作って、それぞれにパラメータを指定します。オーダーには実行スケジュールも個別に指定することができます。
(オーダー:Orderとオーダージョブ:Ordered Jobは別の概念です。オーダージョブはジョブチェーンに組み込まれる1つ1つのジョブで、オーダーはジョブチェーンにパラメータと実行スケジュールを与えて、実行を制御するものです。混同しないようにしましょう。)

ジョブチェーン内でのオーダーの動き

上図を見てください。3つのオーダージョブから構成されるジョブチェーンです。オーダーが2つあるので、このジョブチェーンは(おそらく異なるパラメータで)2つが並行で実行されます。

ステートという言葉が出てきました。ジョブチェーンは1つのオーダージョブが1つのステートに紐付きます。(より正確に言えば、ジョブチェーンは複数のステートで構成され、ステートごとに実行するオーダージョブが紐付くのです。そして、ジョブチェーンの最後に終了ステートがあります。)

オーダーは、まるでトークンのようにステートを遷移していきます。オーダーがstate-1に入ると、Ordered Job #1が実行されます。Ordered Job #1が正常終了すると、オーダーはstate-2に遷移します。state-2ではOrdered Job #2が実行されます。もしOrdered Job #2が異常終了した場合、オーダーはerrorというステートに遷移します。errorは終了ステートに設定されているのでオーダージョブは紐付いていません。オーダーがくり返し実行されるように設定されている場合は、最初のステートに移り、次の実行タイミングを待ちます。

また、あるステートで実行したオーダージョブが異常終了した場合、すぐにerrorステートなどのステートに遷移させずに、リトライ(JobSchedulerではセットバックと呼びます)したり、サスペンドさせておいたりすることが出来ます。

セットバックでは実行回数や待ち時間を設定できます。何回かの実行の後、オーダージョブが正常終了すると、そのステートは正常終了したものとして正常時の次のステートに遷移します。実行回数の上限までオーダージョブが異常終了すると、その時点でそのステートもerrorステートなどのステートに遷移します。

サスペンドは、例えばユーザがJOCでレジュームの操作をするまでジョブチェーンの実行を停止します。オーダージョブを正常終了させるために、何らかのユーザ操作が必要となる場合などは、サスペンドを使うと良いでしょう。

オーダーの起動タイミング

オーダーの起動タイミングは繰り返しでの自動実行が指定されている場合は、オーダーに指定した実行スケジュールに因ります。

JobSchedulerでは、このような時間トリガーだけではなく、ファイルの着信をトリガーとする機能(ディレクトリモニタリング)を持っています。業務システムではファイルのやりとりでデータ連携をするようなケースも多いので、そうした際に活用できるのではないかと思います。

ジョブに関するその他の機能

ジョブはJobSchedulerの根幹となる機能であるだけに、豊富な機能が準備されています。例えば、ロック(排他ロック、共有ロック)、ジョブチェーンのネストなどです。
一度、JobSchedulerの公式サイトを参照いただくと良いと思います。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。2018年、株式会社ビビンコを北九州市に創業。IoTソリューションの開発・導入や、画像認識モデルを活用したアプリの開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。