プログラムでTP1/Client/Jパッケージのインポート宣言をします。
Javaの各機能のパッケージをインポートするのと同様に,TP1/Client/Jのパッケージもインポートしてください。
import java.applet.*; // java.appletパッケージのインポート
import java.awt.*; // java.awtパッケージのインポート
import JP.co.Hitachi.soft.OpenTP1.*; // TP1Clientパッケージのインポート
TP1/Client/Jのクラス名はTP1Clientです。TP1/Serverにアクセスする必要があるときにTP1Clientクラスのインスタンスを作成してください。
TP1Client zaiko; // zaikoというインスタンス変数を宣言
zaiko = new TP1Client(); // TP1Clientクラスのインスタンス作成
// (コンストラクタ呼び出し)
TP1/ServerのSPPを呼び出すためにRPC環境を初期化します。RPC環境を初期化するには,rpcOpenメソッドを呼び出します。
rpcOpenメソッドは,呼び出し時に何らかの問題が発生すると例外を返します。必要に応じて例外処理を行ってください。
なお,スケジューラダイレクト機能を使用したRPC,ネームサービスを利用したRPC,または通信先を指定したRPCを行う場合は,必ずrpcOpenメソッドを呼び出してください。リモートAPI機能を使用したRPCを行う場合は,呼び出さなくてもかまいません。
try {
zaiko.rpcOpen(); // RPC環境の初期化
} catch(ErrFatalException e) { // RPC環境初期化エラー発生
System.out.println("CUP Initialize error");
} catch (TP1ClientException e) { // その他のエラー発生
System.out.println("error occured");
}
try {
zaiko.rpcOpen("C:¥¥Clt4J¥¥conf¥¥clt4j.ini");
// RPC環境の初期化
} catch(ErrFatalException e) { // RPC環境初期化エラー発生
System.out.println("CUP Initialize error");
} catch (TP1ClientException e) { // その他のエラー発生
System.out.println("error occured");
}
リモートAPI機能を使用したRPCを行う場合,TP1/Serverのrapリスナーおよびrapサーバに接続します。接続を解除するまで,Javaアプレット,Javaアプリケーション,またはJavaサーブレットとrapサーバとの間に専用のTCP/IPコネクションが開設されます。
接続するために,TP1ClientクラスのopenConnectionメソッドを呼び出します。openConnectionメソッドは,呼び出し時に何らかの問題が発生すると例外を返します。必要に応じて例外処理を行ってください。
なお,スケジューラダイレクト機能を使用したRPC,ネームサービスを利用したRPC,通信先を指定したRPC,またはオートコネクトモードを使用したRPCを行う場合は,openConnectionメソッドを呼び出さないでください。
try {
zaiko.openConnection("zaikosv",12000);
// rapリスナー,rapサーバとのコネクション確立
} catch(ErrTimedOutException e) { // 接続タイムアウト発生
System.out.println("server inactive");
} catch (TP1ClientException e) { // その他のエラー発生
System.out.println("error occured");
}
rapリスナー,rapサーバと常設コネクションを確立している途中に,rapリスナー,rapサーバ,またはOpenTP1システムが異常終了して常設コネクションが切断された場合でも,CUP側が常設コネクションの切断を検知できないことがあります。その場合,次に発行するメソッド(rpcCall,closeConnection)がErrTimedOutExceptionを返すことがあります。
rapサーバへの接続が成功したあと,遠隔サービス(SPP)を呼び出せます(RPC)。RPCを行うときは,rpcCallメソッドを呼び出します。rpcCallメソッドの引数には,サービスを示すサービスグループ名,サービス名,問い合わせデータ,問い合わせデータ長,応答データ受信領域,応答データ受信領域長,およびRPCの実行形態を指定します。
rpcCallメソッドは,実行時に何らかの問題が発生すると例外を返します。必要に応じて例外処理を行ってください。
int in_len[] = new int[1];
int out_len[] = new int[1];
byte in_data[];
byte out_data[];
String in = "PN=0012-2456-12"; // 問い合わせデータ(便宜上固定文字列)
in_len[0] = 16; // 問い合わせデータ長(便宜上固定)
out_len[0] = 16; // 応答データ領域長(便宜上固定)
in_data = new byte[in_len[0]]; // 問い合わせデータ領域作成
in.getBytes(0, in.length(), in_data, 0);// 問い合わせデータ設定
out_data = new byte[out_len[0]]; // 応答データ領域作成
try {
zaiko.rpcCall("group", "service", // RPC実行(問い合わせ・応答型)
in_data, in_len, out_data, out_len, zaiko.DCNOFLAGS);
} catch (ErrTimedOutException e) { // RPC要求がタイムアウト
System.out.println("RPC timedout");
} catch (TP1ClientException e) { // その他のエラー発生
System.out.println("error occured");
}
なお,RPCには次の表に示す3種類があります。flags引数に指定して選択します。
RPCの種類 | 機能 | 指定方法 | |
---|---|---|---|
問い合わせ応答 | 連鎖なし | サーバに対してサービス要求をしたあと,応答が返る。次回同一サーバへ問い合わせたときは,前回と同一のサーバプロセスで実行するとは限らない。 | DCNOFLAGS |
連鎖あり | サーバに対してサービス要求をしたあと,応答が返る。次回同一サーバへ問い合わせたときは,前回と同一のサーバプロセスで実行する(サーバプロセスを占有して使用する)。なお,スケジューラダイレクト機能を使用したRPC,およびネームサービスを使用したRPCでは使用できない。 | DCRPC_CHAINED | |
応答なし | サーバに対してサービス要求をしたあと,応答を受信できない。サービスを正常に実行できたかどうか,クライアントではわからない。応答を待たないため,クライアントの実行性能が良い。 | DCRPC_NOREPLY |
TP1/Serverとのオンライン業務が完了したあとに,closeConnectionメソッドを呼び出してrapリスナー,rapサーバとの常設コネクションを切断します。このメソッドに引数はありません。
closeConnectionメソッドは,実行時に何らかの問題が発生すると例外を返します。必要に応じて例外処理を行ってください。
try {
zaiko.closeConnection();
// rapリスナー,rapサーバとの常設コネクション切断
} catch (TP1ClientException e) { // エラー発生
System.out.println("error occured");
}
CUPの最後に,rpcCloseメソッドを呼び出してCUPのRPC環境を解放します。このメソッドに引数はありません。
rpcCloseメソッドは,実行時に何らかの問題が発生すると例外を返します。必要に応じて例外処理を行ってください。
try {
zaiko.rpcClose(); // RPC環境の解放
} catch (TP1ClientException e) { // エラー発生
System.out.println("error occured");
}