読者です 読者をやめる 読者になる 読者になる

M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

TACのRPCインターフェースMetaServletのクライアントをつくってみた

f:id:m12i:20160911205558p:plain

前提・問題

最近しごとでTalendに関わる機会がありました。と云いますか随分前からなのですが。よくある顧客上層部の決定にみんな引っ張られる式で「とにかく何でもTalend」です。どうにもならないものもありますが、それはそれとして運用面で看過できない欠点には対策を打ちたいものです。

Talendの有償ソリューションにはTalend Administration Center(TAC)というサーブレットコンテナ上で稼働するジョブ管理用のWebインターフェースが含まれています。このTACによりジョブの参照・更新や実行の権限管理、実行履歴の参照、実行時のパラメータ(コンテキストパラメータ)の設定、スケジュール実行、即時実行などを行うことができます。

が、スケジュール実行機能はようするにcrondのGUIラッパーでしかありませんし、それはそれでガマンするとしても、なんにせよ他の既存の基幹システムの実行制御システムとは独立したサイクルでもってジョブを管理するのですから、運用が煩雑になり事故も起きやすくなるのは想像がつきやすいことと思います。

解決(案)

APIを使用しジョブを実行する*.exeや*jarを用意して、既存のジョブ実行制御システムの運用体制に統合する。

Java製ソリューションではあってもさすがにこのような個別MW製品の話になると、Web上でGoogle先生が教えてくれることも大分僅かになってしまいます。それでもめげずにあれこれお伺いを立ててみると、TACにはMetaServletというRPC(Remote Procedure Call)のためのAPIが付属していることがわかりました。

それもバージョン5.6より前では「ジョブを非同期実行すると以後直接その実行状態を把握するすべがない」というような本気度が大変怪しい実装具合ではあります。しかしそれでもなんとかジョブのステータス(起動中/停止中)の識別や任意タイミングでの非同期オンラインバッチ型起動、そしてログ取得を通じた間接的な実行状態/結果の確認など、一通りのことができそうです。

というわけで、このAPIとやり取りするためのクライアント・ライブラリをつくりました

RPCインターフェースの詳細については公式サイトで配布されているユーザガイド等を参照ください。ただ最低限説明をしておくと、RPCインターフェースはHTTPのGETメソッドを通じてコマンドとその実行結果をやり取りするものです。リクエストはコマンド名とパラメータ(この詳細もリファレンスを参照のこと)を含むJSONBASE64エンコードしてURIに繋ぎ合わせて行います(URIhttp://localhost:8080/org.talend.administrator/metaServlet?(エンコード済みJSON文字列)という形式になります)。対してレスポンスはHTTPレスポンスボディに生の(エンコードされていない)JSONが記載された状態で返ってきます。

作成したアセンブリおよびサンプルのクライアントアプリは汎用性を旨としているので、これらをもとにして具体的なビジネス要件に対応していくことになるでしょう。

ソリューションはXmarin Studioで作成しVisual Studioで少し手を入れたものです。C#バージョン5.0をターゲットとしており、.NET Framework 4.5.2がインストールされた環境で動作確認をとっています。ソリューション配下のプロジェクトとその使い方についてはGitHubリポジトリREADME.mdを参照ください。

(2016/11/21追記)

リポジトリを移転しました。上記記事内のリンク先URLは修正済みです。またあわせてNuGetパッケージとしてNuGet Galleryに登録しました。Visual StudioやXamarin、MonoDevelopなどの依存性管理プロセスに統合されたかたちで利用可能です。