TP1/Client/Jでは,OpenTP1のサーバだけでなく,DCCM3のサーバともRPCを使用した通信ができます。DCCM3とRPCを行うには,DCCM3側に,OpenTP1のRPC要求を解釈する機能が組み込まれていることが前提です。次に示す製品をDCCM3側に組み込むことで,DCCM3ともRPCを使用した通信ができます。
相手サーバがDCCM3の場合の特徴は次のとおりです。
DCCM3のサーバとRPCを使用した通信をする場合,相手サーバをサービスグループ名とサービス名で指定します。この指定方法はOpenTP1のサーバに対してRPCを行う場合と同じです。
DCCM3のサーバとRPCを使用した通信をする場合,OpenTP1のネームサービスの管理外にあるサーバを呼び出すため,TP1/Client/J側でサービス名ごとに定義を分けて,サーバのアドレスを定義する必要があります。サーバのアドレスを定義するには,TP1/Client/J環境定義のdchostオペランドに,それぞれRPC受け付け窓口のホスト名およびポート番号を指定します。
相手サーバのアドレスを定義したあとRPCを実行します。TP1/Client/J環境定義の指定内容によって次に示すようにRPCの実行手順は異なります。
TP1/Client/JとDCCM3論理端末が常設コネクションを使用してRPCを行う場合,コネクション確立時に接続先を複数のDCCM3に振り分けて負荷を分散できます。TP1/Client/Jは,TP1/Client/J環境定義のdchostオペランドに指定された複数のDCCM3論理端末のホスト名およびポート番号の中から,接続先をランダムに選択し,接続を試みます。あるDCCM3論理端末との接続に失敗すると,それ以外のDCCM3論理端末から再びランダムに選択し,接続を試みます。この処理を繰り返し,TP1/Client/J環境定義のdchostオペランドに指定されたすべてのDCCM3論理端末との接続にすべて失敗したときに,初めてエラーを検知します。
TP1/Client/JとDCCM3論理端末とで通信する場合のAPIの実行順序には,次の2とおりがあります。
次に示す図のように動く,DCCM3接続時のTP1/Client/J環境定義の定義例を示します。
図2-30 DCCM3のサーバとのRPC
dcrapdirect=Y
dcwatchtim=180
dcrapautoconnect=Y
dchostselect=Y
#"TRAN1"のトランザクションを処理できるサーバのアドレスを定義
dchost=xxx.xxx.xxx.xxx:10020,zzz.zzz.zzz.zzz:10022
dcrapdirect=Y
dcwatchtim=180
dcrapautoconnect=Y
dchostselect=Y
#"TRAN2"のトランザクションを処理できるサーバのアドレスを定義
dchost=yyy.yyy.yyy.yyy:10021,zzz.zzz.zzz.zzz:10022
上記のTP1/Client/J環境定義を使用したプログラム例を次に示します。
import JP.co.Hitachi.soft.OpenTP1.*;
public class DCCM3Caller
{
...
public void Function1(){
TP1Client clt = new TP1Client();
// TRAN1のトランザクションを呼び出すRPC
clt.rpcOpen("tran1.ini");
...
// 同期応答型RPC
clt.rpcCall("dummysvg", "TRAN1", ..., TP1Client.DCNOFLAGS);
...
clt.rpcClose();
// TRAN2のトランザクションを呼び出すRPC
// 要求先のサーバアドレス取得のために定義を読み直す
clt.rpcOpen("tran2.ini");
...
// 非応答型RPC
clt.rpcCall("dummysvg", "TRAN2", ..., TP1Client.DCRPC_NOREPLY);
...
clt.rpcClose();
}
}