分散トランザクション処理機能 TP1/Connector for .NET Framework 使用の手引
インデクスドレコードとバッファプーリング機能を使用してRPC要求をする場合の,ASP.NET Webアプリケーションでの使用例を次に示します。
なお,コメント中の(1),(2)などは「3.4.3 インデクスドレコードとバッファプーリング機能を使用する場合のメソッド発行手順」の説明の番号に対応しています。
using System; using System.Text; 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) { TP1Connection tc = null; MessageBuffer inBuf = null; MessageBuffer outBuf = null; // このボタンがクリックされたら // OpenTP1<ServerA>のサービス要求を行う // グローバル変数のアプリケーション状態から // TP1ConnectionManagerを取得する // (1) TP1ConnectionManagerクラスの生成 TP1ConnectionManager tcm = (TP1ConnectionManager)this.Application["tcmServerA"]; // (2) 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)(7) 入力データ用メッセージバッファの取得, // および入力データの設定 string indata = "Say Hello to OpenTP1!"; // (6) 入力データ用メッセージバッファの取得 int indataLen = enc.GetByteCount(indata); // (6) 入力データ用メッセージバッファの取得 inBuf = tcm.GetMessageBuffer(indataLen); // (7) 入力データの設定 inBuf.Append(enc.GetBytes(indata)); // (8) 入力用インデクスドレコードの設定 input.Add(inBuf); // (9) 出力用インデクスドレコードの生成 IndexedRecord output = tcm.CreateIndexedRecord("out_record"); // (10) 出力データ用メッセージバッファの取得 // および出力用インデクスドレコードの設定 outBuf = tcm.GetMessageBuffer(this.textBox1.MaxLength*2); output.Add(outBuf); // (11) RPCの実行 bool ret = tc.Execute(ixSpec, input, output); // (12) データの取り出し outBuf = (MessageBuffer)output[0]; // (12) データの取り出し byte[] outdata = outBuf.Buffer; // (12) データの取り出し this.textBox1.Text = enc.GetString(outdata); } catch (TP1ConnectorException exp) { // Connector .NETが検知したエラー } catch (TP1Exception exp) { // Connector .NET(OpenTP1共通クラス)が検知したエラー } catch (Exception exp) { // 予期しない例外 } finally { // (13) 入力用メッセージバッファをバッファプールに戻す if (inBuf != null) inBuf.ReleaseMessageBuffer(); // (14) 出力用メッセージバッファをバッファプールに戻す if (outBuf != null) outBuf.ReleaseMessageBuffer(); // (15) コネクションをコネクションプールに戻す if (tc != null) tc.Dispose(); } } } }
>>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 MESSAGEBUFFER AS 'Hitachi.OpenTP1.Connector.MessageBuffer'. 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'. PROPERTY BUFFER AS 'Buffer'. PROPERTY MESSAGELENGTH AS 'MessageLength'. 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 OUTDATA-LEN PIC S9(9) COMP-5. 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 INBUF USAGE OBJECT REFERENCE MESSAGEBUFFER. 01 OUTBUF USAGE OBJECT REFERENCE MESSAGEBUFFER. 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 OUTBUF-INDEX USAGE BINARY-LONG VALUE 0. 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. * 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. * 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.GetMessageBuffer(入力データサイズ)を * 発行して入力データ用のMessageBuffer実装オブジェクトを取得します INVOKE TCNMGR 'GetMessageBuffer' USING BY VALUE IN-REC-LEN RETURNING INBUF. 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. * MessageBuffer実装オブジェクトが保持しているバッファに * 入力データを設定します INVOKE INBUF 'Append' USING BY VALUE INDATA-ARRAY. * 入力用インデクスドレコードに入力データを設定したバッファを設定します INVOKE INRECORD 'Add' USING BY VALUE INBUF RETURNING RST-INDEX. * 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. * TP1ConnectionManager.GetMessageBuffer(出力データサイズ)を * 発行して出力データ用のMessageBuffer実装オブジェクトを取得し, * 出力用インデクスドレコードに設定します INVOKE TCNMGR 'GetMessageBuffer' USING BY VALUE OUT-REC-LEN RETURNING OUTBUF. INVOKE OUTRECORD 'Add' USING BY VALUE OUTBUF RETURNING RST-INDEX. * 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 OUTBUF-INDEX RETURNING OBJECT-OBJ. SET OUTBUF TO OBJECT-OBJ AS MESSAGEBUFFER. SET OUTDATA-ARRAY TO BUFFER OF OUTBUF. MOVE MESSAGELENGTH OF OUTBUF TO OUTDATA-LEN. CALL 'CBLBYTEARRAYTOX' USING OUTDATA-ARRAY OUTDATA-LEN OUTDATA. SET RECVMSG TO FUNCTION ALPHANUMERIC-TO-STRING(OUTDATA). METHOD-END. * 入力用MessageBuffer実装オブジェクトのReleaseMessageBuffer()を * 発行して入力用メッセージバッファをバッファプールに戻します IF NOT INBUF = NULL THEN INVOKE INBUF 'ReleaseMessageBuffer' END-IF. * 出力用MessageBuffer実装オブジェクトのReleaseMessageBuffer()を * 発行して出力用MessageBufferをバッファプールに戻します IF NOT OUTBUF = NULL THEN INVOKE OUTBUF 'ReleaseMessageBuffer' END-IF. * TP1Connection.Dispose()を発行して,コネクションをコネクション * プールに戻します IF NOT TCX = NULL THEN INVOKE TCX 'Dispose' END-IF. PROG-END. EXIT METHOD. END METHOD SERVICE1. * END OBJECT. END CLASS MyWebService1. *
All Rights Reserved. Copyright (C) 2006, 2009, Hitachi, Ltd.