分散トランザクション処理機能 TP1/Connector for .NET Framework 使用の手引

[目次][用語][索引][前へ][次へ]

3.4.4 インデクスドレコードとバッファプーリング機能を使用してRPC要求をする場合のコーディング例

インデクスドレコードとバッファプーリング機能を使用してRPC要求をする場合の,ASP.NET Webアプリケーションでの使用例を次に示します。

なお,コメント中の(1),(2)などは「3.4.3 インデクスドレコードとバッファプーリング機能を使用する場合のメソッド発行手順」の説明の番号に対応しています。

<この項の構成>
(1) インデクスドレコードとバッファプーリング機能を使用してRPC要求をする場合のコーディング例(C#の場合)
(2) インデクスドレコードとバッファプーリング機能を使用してRPC要求をする場合のコーディング例(COBOL言語の場合)

(1) インデクスドレコードとバッファプーリング機能を使用してRPC要求をする場合のコーディング例(C#の場合)

 
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();
       }
    }
  }
}

(2) インデクスドレコードとバッファプーリング機能を使用して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 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.
*