Client .NETでは,OpenTP1のサーバだけでなく,DCCM3のサーバともRPCを使用した通信ができます。相手サーバがDCCM3の場合の特徴は次のとおりです。
DCCM3のサーバとRPCを使用した通信をする場合,相手サーバはサービスグループ名とサービス名で指定します。この指定方法はOpenTP1のサーバに対するRPCと同じです。
DCCM3のサーバとRPCを使用した通信をする場合,OpenTP1のネームサービスの管理外にあるサーバを呼び出すため,Client .NET側でサービス名ごとに定義を分けて,サーバのアドレスを定義する必要があります。
サーバのアドレスの定義方法を次に示します。
相手サーバのアドレスを定義したあとRPCを実行します。Client .NET構成定義の指定内容によってRPCの実行手順は異なります。
Client .NETとDCCM3論理端末が常設コネクションを使用してRPCを行う場合,コネクション確立時に接続先を複数のDCCM3に振り分けて負荷を分散できます。Client .NETは,Client .NET構成定義の<tp1Server>要素に指定された複数のDCCM3論理端末のホスト名およびポート番号の中から,接続先をランダムに選択し,接続を試みます。あるDCCM3論理端末との接続に失敗すると,それ以外のDCCM3論理端末から再びランダムに選択し,接続を試みます。これを繰り返し,Client .NET構成定義の<tp1Server>要素に指定されたすべてのDCCM3論理端末との接続にすべて失敗したときに,初めてエラーを検知します。
Client .NETとDCCM3論理端末との通信方法を次に示します。
次の図で動くような,DCCM3接続時のClient .NET構成定義の定義例を示します。
図A-1 DCCM3のサーバとのRPC
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section
name="hitachi.opentp1.client"
type="Hitachi.OpenTP1.Common.Util.ProfileSectionHandler,
Hitachi.OpenTP1.Client,Version=7.0.0.0,
Culture=neutral,PublicKeyToken=2440cf5f0d80c91c,Custom=null" />
</configSections>
<hitachi.opentp1.client>
<common>
<rpc use="rap" watchTime="180" />
<rapService autoConnect="true" randomSelect="true" />
</common>
<profile id="tran1">
<!--"TRAN1"のトランザクションを処理できるサーバのアドレスを定義-->
<tp1Server host="xxx.xxx.xxx.xxx" port="10020" />
<tp1Server host="zzz.zzz.zzz.zzz" port="10022" />
</profile>
<profile id="tran2">
<!--"TRAN2"のトランザクションを処理できるサーバのアドレスを定義-->
<tp1Server host="yyy.yyy.yyy.yyy" port="10021" />
<tp1Server host="zzz.zzz.zzz.zzz" port="10022" />
</profile>
</hitachi.opentp1.client>
</configuration>
上記のClient .NET構成定義を使用したプログラム例を次に示します。
using Hitachi.OpenTP1;
using Hitachi.OpenTP1.Client;
public class DCCM3Caller
{
...
public void Function1(){
TP1Client clt = new TP1Client();
// TRAN1のトランザクションを呼び出すRPC
clt.OpenRpc("tran1");
...
// 同期応答型RPC
clt.Call("dummysvg", "TRAN1", ..., TP1ClientFlags.DCNOFLAGS);
...
clt.CloseRpc();
// TRAN2のトランザクションを呼び出すRPC
// 要求先のサーバアドレス取得のために定義を読み直す
clt.OpenRpc("tran2");
...
// 非応答型RPC
clt.Call("dummysvg", "TRAN2", ..., TP1ClientFlags.DCRPC_NOREPLY);
...
clt.CloseRpc();
}
}