4.4.2 インデクスドレコードを使用してRPC要求をする場合のコーディング例
インデクスドレコードを使用してRPC要求をする場合の,ASP.NET Webアプリケーションでの使用例を次に示します。
コメント中の(1),(2)などは「4.4.1 インデクスドレコードを使用する場合のメソッドの発行手順」の説明の番号に対応しています。
- 〈この項の構成〉
(1) ASP.NETでの初期化/終了コードの例1(グローバル変数使用,Global.asax)
<script language="C#" runat="server"> public void Application_OnStart() { this.Application["tcmServerA"] = new TP1ConnectionManager("ServerA"); } public void Application_OnEnd() { this.Application["tcmServerA"] = null; } </script>
(2) ASP.NETでの初期化/終了コードの例2(グローバル変数使用,Global.asax.cs)
using System; using System.Collections; using System.ComponentModel; using System.Web; using System.Web.SessionState; namespace webapp2 { public class Global : System.Web.HttpApplication { … protected void Application_Start(Object sender, EventArgs e) { this.Application["tcmServerA"] = new TP1ConnectionManager("ServerA"); } protected void Application_End(Object sender, EventArgs e) { this.Application["tcmServerA"] = null; } } }
(3) ASP.NETでの初期化/終了コードの例3(ローカル変数使用,Global.asax)
<script language="C#" runat="server"> protected TP1ConnectionManager tcm; public override void Init() { this.tcm = new TP1ConnectionManager("ServerA"); } public override void Dispose() { this.tcm = null; } </script>
(4) ASP.NETでの初期化/終了コードの例4(ローカル変数使用,Global.asax.cs)
using System; using System.Collections; using System.ComponentModel; using System.Web; using System.Web.SessionState; namespace webapp2 { public class Global : System.Web.HttpApplication { … protected TP1ConnectionManager tcm; public override void Init() { this.tcm = new TP1ConnectionManager("ServerA"); } public override void Dispose() { this.tcm = null; } } }
(5) インデクスドレコードを使用してRPC要求をする場合のコーディング例(C#の場合)
using System; using Hitachi.OpenTP1; using Hitachi.OpenTP1.Connector; using MyCompany; namespace MyCompany { public class MyForm1 : System.Web.UI.Page { … private void Button1_Click(object sender, System.EventArgs e) { // このボタンがクリックされたら // OpenTP1<ServerA>のサービス要求を行う // グローバル変数のアプリケーション状態から // TP1ConnectionManagerを取得する // (1) TP1ConnectionManagerクラスの生成 TP1ConnectionManager tcm = (TP1ConnectionManager)this.Application["tcmServerA"]; // (2) TP1Connectionオブジェクトの取得 TP1Connection tc = tcm.GetConnection(); try { Encoding enc = Encoding.Default; // (3) RpcInfoクラスの生成 RpcInfo ixSpec = new RpcInfo(); // (4) サービスグループ名 ixSpec.ServiceGroupName = "SVGRP1"; // (4) サービス名 ixSpec.ServiceName = "SERV1"; // (4) RPC呼び出し形態 ixSpec.Flags = RpcInfo.DCNOFLAGS; // (4) 最大応答待ち時間 ixSpec.WatchTime = 180; // (5) 入力用インデクスドレコードの生成 IndexedRecord input = tcm.CreateIndexedRecord("in_record"); // (6) 入力データの設定 string indata = "Say Hello to OpenTP1!"; // (6) 入力データの設定 input.Add(enc.GetBytes(indata)); // (7) 出力用インデクスドレコードの生成 IndexedRecord output = tcm.CreateIndexedRecord("out_record"); // (8) 出力データ用領域の設定 output.Add(new byte[this.textBox1.MaxLength*2]); // (9) RPCの実行 bool ret = tc.Execute(ixSpec, input, output); // (10) データの取り出し byte[] outBuf = (byte[])output[0]; // (10) データの取り出し this.textBox1.Text = enc.GetString(outBuf); } catch (TP1ConnectorException exp) { // Connector .NETが検知したエラー } catch (TP1Exception exp) { // Connector .NET(OpenTP1共通クラス)が検知したエラー } catch (Exception exp) { // 予期しない例外 } finally { // (11) コネクションをコネクションプールに戻す if (tc != null) tc.Dispose(); } } } }
(6) インデクスドレコードを使用してRPC要求をする場合のコーディング例(COBOL言語の場合)
>>PROPAGATE OFF >>WEBSERVICE >>WEBSERVICE-NAME 'MyWebService1' >>WEBSERVICE-DESCRIPTION 'Sample of OpenTP1' >>WEBSERVICE-NAMESPACE 'http://tempuri.org/' >>END-WEBSERVICE IDENTIFICATION DIVISION. CLASS-ID. MyWebService1 AS 'MyCompany.MyWebService1' IS PUBLIC INHERITS WEBSERVICE. ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. CLASS WEBSERVICE AS 'System.Web.Services.WebService'. CLASS SYSTEMEXCEPTION AS 'System.Exception'. CLASS TP1EXCEPTION AS 'Hitachi.OpenTP1.TP1Exception'. CLASS TP1CONNECTIONMANAGER AS 'Hitachi.OpenTP1.Connector.TP1ConnectionManager'. CLASS TP1CONNECTION AS 'Hitachi.OpenTP1.Connector.TP1Connection'. CLASS INDEXEDRECORD AS 'Hitachi.OpenTP1.Connector.IndexedRecord'. CLASS RPCINFO AS 'Hitachi.OpenTP1.Connector.RpcInfo'. CLASS BYTE-ARRAY AS 'System.Byte' IS ARRAY. CLASS OBJECT-CLS AS 'System.Object'. CLASS CONVERT AS 'System.Convert'. PROPERTY SERVICEGROUPNAME AS 'ServiceGroupName'. PROPERTY SERVICENAME AS 'ServiceName'. PROPERTY FLAGS AS 'Flags'. PROPERTY WATCHTIME AS 'WatchTime'. IDENTIFICATION DIVISION. OBJECT. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 SERVICE-GROUP PIC X(6) VALUE 'SVGRP1'. 01 SERVICE-NAME PIC X(5) VALUE 'SERV1'. PROCEDURE DIVISION. >>WEBMETHOD >>WEBMETHOD-DESCRIPTION 'SERVICE1' >>WEBMETHOD-ENABLESESSION FALSE >>WEBMETHOD-CACHEDURATION 0 >>WEBMETHOD-BUFFERRESPONSE TRUE >>END-WEBMETHOD IDENTIFICATION DIVISION. METHOD-ID. SERVICE1 IS PUBLIC. ENVIRONMENT DIVISION. DATA DIVISION. LOCAL-STORAGE SECTION. 01 IN-REC PIC X(20) VALUE SPACE. 01 IN-REC-LEN PIC S9(9) COMP-5 VALUE 20. 01 OUTDATA PIC X(20) VALUE SPACE. 01 OUT-REC-LEN PIC S9(9) COMP-5 VALUE 20. 01 TCNMGR USAGE OBJECT REFERENCE TP1CONNECTIONMANAGER. 01 TCX USAGE OBJECT REFERENCE TP1CONNECTION. 01 INRECORD USAGE OBJECT REFERENCE INDEXEDRECORD. 01 OUTRECORD USAGE OBJECT REFERENCE INDEXEDRECORD. 01 RIF USAGE OBJECT REFERENCE RPCINFO. 01 OBJECT-OBJ OBJECT REFERENCE OBJECT-CLS. 01 SERVICE-GROUP-STR USAGE STRING. 01 SERVICE-NAME-STR USAGE STRING. 01 IN-RECORD-NAME-STR USAGE STRING. 01 OUT-RECORD-NAME-STR USAGE STRING. 01 IN-RECORD-NAME PIC X(10) VALUE 'in_record'. 01 OUT-RECORD-NAME PIC X(10) VALUE 'out_record'. 01 INDATA-ARRAY OBJECT REFERENCE BYTE-ARRAY. 01 OUTDATA-ARRAY OBJECT REFERENCE BYTE-ARRAY. 01 RPC-FLAGS USAGE BINARY-LONG VALUE 0. 01 WATCH-TIME USAGE BINARY-LONG VALUE -1. 01 RST-INDEX USAGE BINARY-LONG VALUE 0. 01 RESULT USAGE LOGICAL. 01 OUTDATA-LEN PIC S9(9) COMP-5. 01 TMP-LEN USAGE BINARY-LONG. 01 OUTLEN-INDEX USAGE BINARY-LONG VALUE 1. LINKAGE SECTION. 01 SENDMSG USAGE STRING. 01 RECVMSG USAGE STRING. PROCEDURE DIVISION USING BY VALUE SENDMSG RETURNING RECVMSG. DECLARATIVES. TP1-EXCEPTION SECTION. USE AFTER EO TP1EXCEPTION. * Connector .NET(OpenTP1共通クラス)が検知したエラー RESUME METHOD-END. ERROR-HANDLER1 SECTION. USE AFTER EO SYSTEMEXCEPTION. * 予期しない例外 RESUME METHOD-END. END DECLARATIVES. MAIN-PROC. * TP1ConnectionManagerのインスタンスを生成 INVOKE TP1CONNECTIONMANAGER 'New' RETURNING TCNMGR. * TP1ConnectionManager.GetConnection()でTP1Connectionを取得します INVOKE TCNMGR 'GetConnection' RETURNING TCX. * TP1ConnectionManager.CreateIndexedRecord()を発行して * 入力用インデクスドレコードを生成します SET IN-RECORD-NAME-STR TO FUNCTION ALPHANUMERIC-TO-STRING(IN-RECORD-NAME). INVOKE TCNMGR 'CreateIndexedRecord' USING BY VALUE IN-RECORD-NAME-STR RETURNING INRECORD. * TP1ConnectionManager.CreateIndexedRecord()を発行して * 出力用インデクスドレコードを生成します SET OUT-RECORD-NAME-STR TO FUNCTION ALPHANUMERIC-TO-STRING(OUT-RECORD-NAME). INVOKE TCNMGR 'CreateIndexedRecord' USING BY VALUE OUT-RECORD-NAME-STR RETURNING OUTRECORD. * 入力用インデクスドレコードに入力データを設定します INVOKE BYTE-ARRAY 'New' USING BY VALUE IN-REC-LEN RETURNING INDATA-ARRAY. MOVE FUNCTION STRING-TO-ALPHANUMERIC(SENDMSG) TO IN-REC. CALL 'CBLXTOBYTEARRAY' USING IN-REC INDATA-ARRAY IN-REC-LEN. INVOKE INRECORD 'Add' USING BY VALUE INDATA-ARRAY AS OBJECT-CLS RETURNING RST-INDEX. * 出力データ用領域を確保して出力用インデクスドレコードに設定します INVOKE BYTE-ARRAY 'New' USING BY VALUE OUT-REC-LEN RETURNING OUTDATA-ARRAY. INVOKE OUTRECORD 'Add' USING BY VALUE OUTDATA-ARRAY AS OBJECT-CLS RETURNING RST-INDEX. * RpcInfoのインスタンスを生成します INVOKE RPCINFO 'New' RETURNING RIF. * RpcInfoオブジェクトにサービスグループ名を設定します SET SERVICE-GROUP-STR TO FUNCTION ALPHANUMERIC-TO-STRING(SERVICE-GROUP). SET SERVICEGROUPNAME OF RIF TO SERVICE-GROUP-STR. * RpcInfoオブジェクトにサービス名を設定します SET SERVICE-NAME-STR TO FUNCTION ALPHANUMERIC-TO-STRING(SERVICE-NAME). SET SERVICENAME OF RIF TO SERVICE-NAME-STR. * RpcInfoオブジェクトにRPC呼び出し形態を設定します MOVE RPC-FLAGS TO FLAGS OF RIF. * RpcInfoオブジェクトに最大応答待ち時間を設定します MOVE WATCH-TIME TO WATCHTIME OF RIF. * TP1Connection.Execute()を発行してRPC要求を行います INVOKE TCX 'Execute' USING BY VALUE RIF BY VALUE INRECORD BY VALUE OUTRECORD RETURNING RESULT. * 出力用インデクスドレコードからデータを取り出します INVOKE OUTRECORD 'get_Item' USING BY VALUE OUTLEN-INDEX RETURNING OBJECT-OBJ. INVOKE CONVERT 'ToInt32' USING BY VALUE OBJECT-OBJ RETURNING TMP-LEN. MOVE TMP-LEN TO OUTDATA-LEN. CALL 'CBLBYTEARRAYTOX' USING OUTDATA-ARRAY OUTDATA-LEN OUTDATA. SET RECVMSG TO FUNCTION ALPHANUMERIC-TO-STRING(OUTDATA). METHOD-END. * TP1Connection.Dispose()を発行して,コネクションをコネクション * プールに戻します IF NOT TCX = NULL THEN INVOKE TCX 'Dispose' END-IF. PROG-END. EXIT METHOD. END METHOD SERVICE1. * END OBJECT. END CLASS MyWebService1. *