JobSchedulerのREST-APIを使ってみる

JobSchedulerのREST-APIを使ってみる

#1. 最初に －JobSchedulerについて－

先月中旬から仕事で初めて使ったSOS社のJobSchedulerについて、これまで得られた知見をまとめました。
JobSchedulerの魅力は何といっても、プログラマブル・多機能で、Mashupの余地が大いにある点です。
OSSならではの良さが沢山あり、さわってみると萌えます。
また、ユーザ会の船井会長・皆様が親切で、普及に向けて熱心に活動されているところも素晴らしいです。
このチャーミングなジョブ管理ツールが、日本でもう少し流行するように、自分も情報発信したいと考えました。


#2. 本ドキュメントの目的

最近のバージョンから追加された、REST-API(JASONベース)機能向けRestClientのサンプルを紹介します。
以下の処理を行うRestClientの雛形を作りました。

-----------------------------
・認証
　（Basic認証のリクエストを実施して、AccesTokenを取得）
・REST-APIにリクエスト発行
　（AccessTokenを用いてRescClientからオーダ情報を取得するリクエスト発行）
・返却値のパース処理
　（JASON形式の階層構造を持つ返却値をパースする）

-----------------------------

足回りのよいPython等のScript言語と比較すると、Javaで実装するのはいろいろ面倒な印象がありますが
お便利ライブラリを導入する事で、かなり短工数で実装できます。
普段あまりJavaのプログラミングをする機会がない基盤系エンジニアの方に簡単にお試しいただけるような、シンプルなコードを書きました。


#3. 構成
###【REST-API】
今回用いるREST-APIの仕様は以下をご参照ください。

JobSchedulerのあらゆるシステム情報のViewを取得できるREST-APIの受付URL一覧です。
http://test.sos-berlin.com/JOC/raml-doc/JOC-API/

オーダ情報を取得するREST-APIの詳細なI/F情報はこちらをご参照ください。
http://test.sos-berlin.com/JOC.1.11.0/raml-doc/JOC-API/resource/orders.html

認証用のREST-APIのI/Fについては、こちらの記事がとてもわかりやすかったです。
https://qiita.com/ike_dai/items/8eb4a542aa59937a5f64

###【検証環境】
VirtualBox上に構築しました(CentOS-7-x86_64-Minimal-1708.iso）

-----------------------------
・JobScheduler:(1.11.4)
・OS:RHEL Ver7.3
・DB:PostgreSQL 9.6.X
・Java：JDK1.8.0_152-b16

-----------------------------
###【追加で導入するライブラリ】
RestClient実装用に「jersey」を導入
JASON形式データのパース用に「jackson」を導入

-----------------------------
・jersey-bundle-1.18.jar
・jackson-core-2.1.4.jar
・jackson-databind-2.2.0-rc1.jar
・jackson-annotations-2.0.0-rc1.jar

-----------------------------

###【サンプルプログラム】
作成したプログラムのパッケージ情報と配置先です。

```
tmp
└─kaeru
        ├─ RestClient.java
        ├─ RestClient.class
        ├─ RestTest.java
        └─ RestTest.class

```

###【検証環境構築手順】
検証環境を構築する詳細手順は、ユーザ会会長の船井様の記事をご参照ください。
https://qiita.com/satoruf/items/fd78523c68a7c2a0593e

構築後にJOC（Jetty）とマネージャを起動します。


#4. RestClient本体のソース
RestClientの本体のソースはこちらです。

**/tmp/kaeru/RestClient.java**
https://qiita.com/yatabekaeru/items/b8f03cccfb8b904efe99

### ①Basic認証用のClient
Basic認証用のClient生成時には、HTTPBasicAuthFilterを適用します。
リクエストボディにはデータの設定は不要です。

### ②AccessToken認証用のClient
AccessToken発行後にリクエストを発行するClientは、ヘッダフィールドにAccessTokenを設定します。
リクエストボディには、REST-API各種のインタフェース仕様に準じて、適宜データを設定します。

「Orders」へのリクエスト発行時には、以下のJASON形式の文字列をリクエストボディに設定する仕様です。
『  **{ jobschedulerId："scheduler" }**  』


#5．テストクラスのソース
テストクラスはこちらです。

**/tmp/kaeru/RestTest.java**
https://qiita.com/yatabekaeru/items/06e7d40a12935f107458

Basic認証によるAccessToken発行時とREST-API「Orders」へのリクエストの2回、
所定のURLにPOSTリクエストを投げます。
後者のレスポンスとして返却されたデータをJASONパーサでパースします。





#6．簡単コンパイル
以下の手順でコンパイルを行います。
超簡単実行環境です。
デプロイツール無しの気軽な手順でざくざくBatch処理を作成できます。

**★以下、検証環境にターミナルで接続して、schedulerユーザで実施します。**

### ①パッケージの配置ディレクトリ作成

パッケージ配置ディレクトリを作成します。

```
mkdir /tmp/kaeru

```

### ②ソースファイル配置

ソースファイルを配置します。

```
/tmp/kaeru/RestClient.java
/tmp/kaeru/RestTest.java

```

### ③追加jarファイルの配置

追加jarファイルを、任意のディレクトリに配置します。
（例：/usr/java/jdk1.8.0_152/ap_lib/ 配下など。）
※配置場所によってはrootで実行


### ④CLASSPATH変数設定

CLASSPATH変数を環境変数に設定します。

```
CLASSPATH=/usr/java/jdk1.8.0_152/ap_lib/jersey-bundle-1.18.jar:/usr/java/jdk1.8.0_152/ap_lib/jackson-core-2.1.4.jar:/usr/java/jdk1.8.0_152/ap_lib/jackson-databind-2.2.0-rc1.jar:/usr/java/jdk1.8.0_152/ap_lib/jackson-annotations-2.0.0-rc1.jar:/usr/java/jdk1.8.0_152/jre/lib:/tmp/
export CLASSPATH

```

### ⑤ディレクトリ移動

パッケージディレクトリの1つ上のディレクトリに移動します。
(/tmp/kaeru がパッケージディレクトリの場合）

```
cd /tmp

```

### ⑥コンパイル実行

javacコマンドでコンパイルします

```
javac kaeru/RestClient.java kaeru/RestTest.java

```

※コンパイルが成功すると同じディレクトリにclassファイルができています。

### ⑦実行権限付与

実行権限を付与します。

```
chmod +x /tmp/kaeru/*.class

```

#7．実行

以下にコマンド実行手順を記載します。

**★以下コンパイルしたターミナルと同じターミナルにてschedulerユーザで実行します。**
（別のターミナルから起動する場合は、CLASSPATHを再設定します）

### ①ディレクトリ移動

パッケージディレクトリの1つ上のディレクトリに移動します。
(/tmp/kaeru がパッケージディレクトリの場合）

```
cd /tmp

```

### ②サンプルプログラム実行

以下のコマンドでサンプルプログラムを実行します。

```
java kaeru.RestTest

```

### ③実行結果

```
[scheduler@localhost tmp]$ java kaeru.RestTest

<払い出されたAccessToken>

*****1cf7ffa4-ab60-4604-a0e8-36d93b7abe95

<JASON形式のデータ>

[orderId]: createDailyPlan [job]: /sos/dailyplan/CreateDailyPlan [path]: /sos/dailyplan/CreateDailyPlan,createDailyPlan [status]: PENDING [nextStart]: 2018-01-08T15:01:00Z
[orderId]: MonitorSystem [job]: /sos/notification/SystemNotifier [path]: /sos/notification/SystemNotifier,MonitorSystem [status]: PENDING [nextStart]:
[orderId]: AcknowledgeMonitorSystem [job]: /sos/notification/ResetNotifications [path]: /sos/notification/ResetNotifications,AcknowledgeMonitorSystem [status]: PENDING [nextStart]:
[orderId]: Reporting [job]: /sos/reporting/ReportingAggregation [path]: /sos/reporting/Reporting,Reporting [status]: PENDING [nextStart]:
[orderId]: Cleanup [job]: /sos/notification/CleanupNotifications [path]: /sos/notification/CleanupNotifications,Cleanup [status]: PENDING [nextStart]:
[orderId]: Unskip [job]: /sos/operations/criticalpath/UncriticalJobNodes [path]: /sos/operations/criticalpath/UncriticalJobNodes,Unskip [status]: PENDING [nextStart]:
[orderId]: Skip [job]: /sos/operations/criticalpath/UncriticalJobNodes [path]: /sos/operations/criticalpath/UncriticalJobNodes,Skip [status]: PENDING [nextStart]:


```


#8. NextStep

もう少しJavaっぽく作るなら、データ格納用クラスとマッパを用意してオブジェクトマッピングを実装します。
運用や監視に必要となるREST-API一式分作成すると、ちょっとすてきな運用ツールになります。


#9．注意！

JOCでもJerseyを用いてRESTfulAPIサービスを起動しています。
Jettyが参照するPATH上に追加分のライブラリを配置すると、正常動作しなくなる場合があります！
-- 環境によりバージョン競合を起こすためです。

**追加分のjarファイルは必ず個別に配置するようにして、関係の無いサービスが参照しないようにご留意ください。**


#10．最後に

以上、駆け足でREST-APIのサンプルプログラムを紹介しました。
（お正月クオリティにつき、どうかご容赦を。。）

また稿を改めて、実際の運用ツールとして仕立てる記事をアップしたいと思います。