タスクのプログラミング - Java
目次
RubyやJavaプログラムは、コントロールプランのどのノードでも実行できます。そのプログラムは、ノード上で右クリックしてEdit Script オプションを選ぶことで編集します。Java処理を選ぶには、ノード上で右クリックしてJavaオプションを選択します。コントロールプランは、単一モードでJavaのプレースタスクとRubyのプレースタスクの混在を認めます。インピーダンスとエンベロープ(後述します)を介したデータ交換は、JavaとRubyプレース間で機能します。
標準Javaプログラム
ほとんどのJavaスクリプトはエディターのウィンドウに直接書き込むことができ、そのプレースにトークンが到着したときに実行されます。STDOUTへの書き込みは、コンソールへのプリント出力となります。たとえば、下記のコマンドはそのプレースのためのコンソールとセンターコンソールに"Hello World" とプリントします。print("Hello World!");
プレースのパラメータ
Javaコードのサンプルを含む、タスク処理のパラメータについての説明は、データ構造 のセクションを参照して下さい。インピーダンス
Javaコードのサンプルを含む、インピーダンスの説明、入力仕様と出力仕様の説明については、データ構造 のセクションを参照して下さい。トークンのエンベロープデータ
Javaコードのサンプルを含む、トークンのエンベロープデータについては、データ構造 のセクションを参照して下さい。制約
Javaコードのサンプルを含む、条件的制約の説明については、データ構造 のセクションを参照して下さいJavaからの外部プログラムの呼び出し
外部プログラムをControl Plan Editor のJavaプログラムから呼び出すことができます。プレースタスクから呼び出したいPerlプログラムがあると想定します。この例では、Windowsシステム上でControl Plan Editorを実行し、下記PerlプログラムがC:\Program Files\Tap In Systems\WorkflowActionEditorディレクトリのhello.plに入っているとします。print "Hello World!\n";プレーススクリプト内には下記のJavaプログラムがあります。今プログラムは、パラメータテーブルから実行パラメータを受け取るよう、汎用化されています。また、それは結果をそのエンベロープで渡すので、後続のプレースでそれを使用できます。
argCount = 0; s=myself.getString("arg"+argCount); while(s != null && s.length() != 0) { argCount++; s=myself.getString("arg"+argCount); } args = new String[argCount]; for (i=0;i<argCount;i++) { args[i] = s=myself.getString("arg"+i); } pgm = myself.getString("Program"); dir = myself.getString("Dir"); input = myself.getString("Input"); if (pgm == null) { myself.addError("Paramater 'Program' was not specified!"); return; } shell = new com.spiderweb.exec.Shell(pgm,dir,args,input); shell.start(); count = 0; while(shell.isRunning()) { Thread.sleep(10); count += 10; } rc = shell.getResult(); returns = shell.printResults(); print(returns); myself.add("rc",rc); myself.add("returns",returns);このプログラムは下記のように、パラメータテーブル内に実行パラメータが定義されていることを前提としています:
名前 |
値 |
Program |
C:/Perl588/bin/perl.exe |
Dir |
|
arg0 |
C:/Program Files/Tap In Systems/WorkflowActionEditor/hello.pl |
arg1 |
|
arg2 |
|
arg3 |
|
arg4 |
|
Input |
このプレースが実行されると、下記がコンソール上に表示されます。
Hello World!Perl スクリプトは単に"Hello World!"をSTDOUTに出力します。このテクニックは、どのようなプログラム呼び出しにも使用でき、その出力を取り込んで、その結果をモデルが翻訳します。Perlで記述された多数のシステム管理や監視コマンドがあるため、それらのプログラムを呼び出してそれらの結果をモデル中で処理することができます。この方法は、他の言語でも同様に使えます。
タイマー
Javaの中の時間待ち関数が、下記のコードで実行できます。この例は、2秒(2000ミリ秒)待ちます。Thread.sleep(2000);
データベースアクセス
JavaタスクプロセスはJava ExternalDatabaseオブジェクトの参照を使用して、データベース問い合わせを実行できます。 データベースオブジェクトは一つのプレースで作成し、そのオブジェクトを他のプレースで使用するためにデータエンベロープに入れて渡すことに注意してください。下記のサンプルは、どのようにコントロールプラン中でMySQLに接続するかを示します。下記のモデルを作成することを想定します。MySQL_Connect プレースの中に下記のコードがあります:
db = new com.tapin.petri.net.ExternalDatabase("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306", "aptest","testlog","root",""); myself.add("db",db);このコードは、Javaオブジェクト参照メソッドを使う、"aptest" という名称のMySQL データベースにコネクトします。そして、"db"の名前を使ってデータエンベロープにコネクションオブジェクトを追加します。 その後で、Sample_Query プレースで下記のJavaコードがあります。
db = myself.get("db"); res = db.query("select * from testlog"); i = 0; while(res.next()) { i++; } print("Number of records = " + i);
コネクションオブジェクトを取得し、そしてtestlog テーブル上で select を実行します。Java のコネクションオブジェクトを使用しているので、select の結果を読むには Java のメソッドを使用必要があることに注意してください。Sample_Query コンソール上のサンプルの出力は下記のようになります。
Number of records = 3
他の方法として、Jruby mysql gem をロードして、MySQL データベースへの接続と問い合わせにRubyを使う方法があります。しかし、Java のExternalDatabase クラスはControl Plan Editor に組み込まれているので、セットアップはこのサンプルの方が容易です。
Tap In 管理サーバからの監視イベント取得
本稿では、システム管理のための自動化モデルの構築に焦点を当てているため、サーバ状態、クラウドインスタンス、パフォーマンス統計、ネットワークコンポーネントのステータスとアプリケーションイベントといった、管理対象ITインフラストラクチャの現在状態に基づいたトリガーモデルが必要です。下記のコードは、Tap In 管理サーバに接続してアクティブなアラームを問い合わせる方法を示します。// Java Tap In management server log in and get alarms host = myself.get("host"); port = myself.get("port"); username = myself.get("username"); password = myself.get("password"); ssl = myself.get("ssl"); spider = new net.Spider(myself.getContextName(),host,port,username,password,ssl); count = 0; while(spider.loggedIn == false && count++ < 5) { Thread.sleep(1000); } myself.add("status",spider.loggedIn); myself.add("spider",spider);
Tap In 管理サーバへのイベント送出
他の重要な機能として、コントロールプランの結果に基づいてオペレータへの通知ができることです。Tap In 管理サーバへのイベント通知により、オペレータがそれらの結果を見ることができます。また、イベントはデータベースにロギングされるので、コントロールプラン実行の監査ログになります。host = "xxxxx.tapinsystems.net"; port = 9009; username = "userid"; password = "pass"; ssl = false; spider = new net.Spider(myself.getContextName(),host,port,username,password,ssl); count = 0; while(spider.loggedIn == false && count++ < 5) { Thread.sleep(1000); System.out.println("Loggin in? Try "+ count ); } int sev = 5; int prio = 50; int count = 1; String cls = "ActionPlan"; String group = ""; String rule = "send_event"; String msg = "Test Message"; String asto = ""; String rtto = ""; String t1 = "t1";String t2 = "";String t3 = ""; String n1 = "n1";String n2 = "";String n3 = ""; long first = System.currentTimeMillis(); long last = first; int stat = 0; String ga = ""; double gv = 0; long timeout = 0; long escalates = 0; String json = ""; spider.addUpdateableAlarm(sev,prio,count,cls,group,rule, msg,asto,rtto,t1,t2,t3,n1,n2,n3, first,last,stat,ga,gv,timeout, escalates,json );このコードの最初の部分は、前の例のように、Tap In 管理サーバにログインします。 残りのコードで、送出するイベントをフォーマットします。イベントのフォーマットはフレキシブルであり、モデルのプレースを表す状態を提供する必要があります。イベントがどのように処理され、イベントのフィールドが使用されるかについての説明は、イベント管理アーキテクチャの概要 を参照してください。