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

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

3.4.2 インデクスドレコードを使用してRPC要求をする場合のコーディング例

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

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

<この項の構成>
(1) ASP.NETでの初期化/終了コードの例1(グローバル変数使用,Global.asax)
(2) ASP.NETでの初期化/終了コードの例2(グローバル変数使用,Global.asax.cs)
(3) ASP.NETでの初期化/終了コードの例3(ローカル変数使用,Global.asax)
(4) ASP.NETでの初期化/終了コードの例4(ローカル変数使用,Global.asax.cs)
(5) インデクスドレコードを使用してRPC要求をする場合のコーディング例(C#の場合)
(6) インデクスドレコードを使用してRPC要求をする場合のコーディング例(COBOL言語の場合)

(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.
*