付録A.1 DCCM3とのRPC
Client .NETでは,OpenTP1のサーバだけでなく,DCCM3のサーバともRPCを使用した通信ができます。相手サーバがDCCM3の場合の特徴は次のとおりです。
-
使用できるRPCの形態は,同期応答型RPCと非応答型RPCです。連鎖RPCは使用できません。
-
トランザクション制御機能は使用できません。
-
常設コネクションを使用してDCCM3論理端末へRPCを行う場合,負荷分散機能を使用できます。詳細については,「付録A.1(4) DCCM3論理端末に対してRPCを行う場合の負荷分散」を参照してください。
-
DCCM3に対してRPCを行う場合,サービス名がトランザクション名称と評価されます。
-
DCCM3のサーバ側に,OpenTP1のRPC要求を解釈する機能が組み込まれていることが前提になります。この機能は,DCCM3/SERVER/TP1,およびDCCM3/Internetが提供します。
- 〈この項の構成〉
(1) 相手サーバの指定方法
DCCM3のサーバとRPCを使用した通信をする場合,相手サーバはサービスグループ名とサービス名で指定します。この指定方法はOpenTP1のサーバに対するRPCと同じです。
-
サービスグループ名
サービスグループ名として不正でないダミーの文字列を指定します。
1〜31文字の識別子を指定してください。
-
サービス名
DCCM3側のトランザクション名称を指定します。
使用できる文字は,アルファベット(A〜Z,a〜z)と数字(0〜9)です。文字数の合計が1〜8文字になるように指定してください。
(2) 相手サーバのアドレス定義
DCCM3のサーバとRPCを使用した通信をする場合,OpenTP1のネームサービスの管理外にあるサーバを呼び出すため,Client .NET側でサービス名ごとに定義を分けて,サーバのアドレスを定義する必要があります。
サーバのアドレスの定義方法を次に示します。
-
Client .NET構成定義の<tp1Server>要素のhost属性およびport属性に,それぞれRPC受け付け窓口のホスト名およびポート番号を指定します。
(3) RPCの実行手順
相手サーバのアドレスを定義したあとRPCを実行します。Client .NET構成定義の指定内容によってRPCの実行手順は異なります。
(a) <rapService>要素のautoConnect属性にtrueを指定した場合
-
OpenRpcメソッドを実行して,定義を読み込みます。
-
Callメソッドを実行します。
Client .NET構成定義の<tp1Server>要素で指定したRPC受け付け窓口に,自動でコネクションを確立します。コネクションの確立後,RPCを行います。
(b) <rapService>要素のautoConnect属性にfalseを指定,または指定を省略した場合
-
OpenRpcメソッドを実行して,定義を読み込みます。
-
引数なしのOpenConnectionメソッドを実行します。
Client .NET構成定義の<tp1Server>要素で指定したRPC受け付け窓口に,コネクションを確立します。
-
コネクションの確立後,Callメソッドを実行してRPCを行います。
(c) <tp1Server>要素で指定したサーバ以外と通信する場合
-
OpenRpcメソッドを実行して,定義を読み込みます。
この手順は省略できます。省略した場合でも,2.および3.は実行できます。
-
OpenConnectionメソッドの引数にRPC受け付け窓口(ホスト名,ポート番号)を指定して,OpenConnectionメソッド実行します。
-
コネクションの確立後,Callメソッドを実行してRPCを行います。
(4) DCCM3論理端末に対してRPCを行う場合の負荷分散
Client .NETとDCCM3論理端末が常設コネクションを使用してRPCを行う場合,コネクション確立時に接続先を複数のDCCM3に振り分けて負荷を分散できます。Client .NETは,Client .NET構成定義の<tp1Server>要素に指定された複数のDCCM3論理端末のホスト名およびポート番号の中から,Client .NET構成定義の<rapService>要素のrandomSelect属性にYを指定することで,接続先をランダムに選択し,接続を試みます。あるDCCM3論理端末との接続に失敗すると,それ以外のDCCM3論理端末を<tp1Server>要素に指定された順で選択し,接続を試みます。これを繰り返し,Client .NET構成定義の<tp1Server>要素に指定されたすべてのDCCM3論理端末との接続にすべて失敗したときに,初めてエラーを検知します。
Client .NETとDCCM3論理端末との通信方法を次に示します。
-
Client .NET構成定義の<tp1Server>要素にDCCM3論理端末のホスト名およびポート番号を指定し,引数なしのOpenConnectionメソッドを実行します。
この場合,常設コネクションを使用します。
-
Client .NET構成定義の<tp1Server>要素にDCCM3論理端末のホスト名およびポート番号,<rapService>要素のrandomSelect属性にtrueを指定します。
-
Client .NET構成定義の<rapService>要素のautoConnect属性にtrueを指定した場合,Callメソッドを実行します。Callメソッドを実行すると,コネクション未確立時には,自動でコネクションを確立します。
Client .NET構成定義の<rapService>要素のautoConnect属性にfalseを指定,または指定を省略した場合,引数なしのOpenConnectionメソッドを実行します。引数なしのOpenConnectionメソッドを実行すると,コネクションを確立します。
(5) Client .NET構成定義の定義例
次の図で動くような,DCCM3接続時のClient .NET構成定義の定義例を示します。
|
-
Client .NET構成定義で,各トランザクションを処理するサーバのアドレス(RPC受け付け窓口)を,プロファイルIDを分けて<tp1Server>要素に定義します。
-
RPCを行うとき,プロファイルIDからRPC受け付け窓口のアドレスを求め,RPCのメッセージを送信します。
-
RPCのメッセージを解釈し,要求されたサービスを実行します。
-
同期応答型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(); } }
(6) DCCM3論理端末に対してRPCを行う場合の注意事項
-
リモートAPI機能を使用したRPCだけ使用できます。
-
連鎖RPCは使用できません。
-
.NETインタフェース定義を使用したRPCは使用できません。
-
データ圧縮機能を使用したRPCは使用できません。
-
サービス定義を使用したRPCは,次の条件をすべて満たしている場合だけ使用できます。
-
データ型定義によってデータの形式をメッセージの単位に定義できる。
-
文字列を含まないデータ,または.NET Frameworkがサポートしているエンコード方式でエンコードおよびデコードできる文字列のデータを送受信する。
なお,.NET Frameworkがサポートしているエンコード方式については,.NET Frameworkのドキュメントを参照してください。
-
-
トランザクション制御機能は使用できません。
-
文字列のデータを含むメッセージを送受信する場合,あらかじめメッセージ中の文字コードを通信先システムと決めた上で,必要に応じてUAPで文字コード変換を行ってください。.NET Framework上では,Unicode(リトルエンディアン)が文字列データのメモリ上の内部表現として使用されます。
-
Client .NET構成定義で,<rapService>要素のinquireTime属性を指定しても無効になります。CUP.NETからサーバに対する問い合わせの間隔最大時間は,DCCM3の「端末放置監視時間」で指定してください。
-
常設コネクションかつオートコネクトモードを使用したシステムで,次のタイミングが重なった場合,RPCの実行に失敗して例外を返すことがあります。
-
rapサーバが常設コネクションを解放するタイミング
-
CUP.NET実行プロセスがRPCを実行するタイミング
この現象を回避するには,次の値を指定してください。
-
<rapService>要素のinquireTimeCheck属性※:true
-
<rapService>要素のinquireTime属性:DCCM3の「端末放置監視時間」と同じ値
inquireTimeCheck属性,およびinquireTime属性の説明については「3. 構成定義」の<rapService>要素を参照してください。
- 注※
-
TP1/Client for .NET Frameworkのバージョン07-03-07以降で指定できます。
-
-
DCCM3側の注意事項については,マニュアル「VOS3 データマネジメントシステム XDM E2系 解説」および「VOS1 データコミュニケーションマネジメントシステム DCCM3 解説」を参照してください。