Hitachi

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


4.5.3 サービス定義から生成したクライアントスタブの使用例

クライアントスタブの使用例を次に示します。

この例で呼び出すSPP.NETのサービスメソッドの情報は次のとおりです。

なお,コメント中の(1),(2)などは「4.5.2 クライアントスタブの使用方法」の説明の番号に対応しています。

〈この項の構成〉

(1) サービス定義の定義例(C#の場合)

(a) サービス定義の定義例(業務1のサービス定義)

#include "mydata.h"
/* 業務1のサービス定義 */
interface GYOUMU1 {
    GETDATA1(in_data, out_data);
    GETDATA2(in_data, out_data2);
}

(b) データ型定義の定義例(mydata.h)

struct in_data {
       long i_basho[3];
       long i_kakaku;
};
struct out_data {
       char o_name[20];
       char o_basho[16];
       long o_kakaku;
       char o_inf[80];
};
struct out_data2 {
       int o_count;
       struct data {
              char o_name[20];
              char o_basho[16];
              long o_kakaku;
              char o_inf[80];
       } data_t[100];
};

(2) カスタムレコードクラスの出力例(C#の場合,in_data.cs)

using Hitachi.OpenTP1.Common;
 
namespace MyCompany
{
    public class in_data : RecordImpl 
    {
        public in_data() : base("default")
        {
            …
        }
        public in_data(string recordName) : base(recordName)
        {
            …
        }
        …
        private int[] _i_basho;
        public int[] i_basho
        {
            get
            {
                return _i_basho;
            }
            set
            {
                _i_basho = value;
            }
        }
 
        private int _i_kakaku = 0;
        public int i_kakaku
        {
            get
            {
                return _i_kakaku;
            }
            set
            {
                _i_kakaku = value;
            }
        }
        …
    }
}

(3) クライアントスタブの使用例(SPP.NET,C#の場合)

using System;
using Hitachi.OpenTP1;
using Hitachi.OpenTP1.Server;
 
namespace MyCompany
{
public class CallerSample2Impl : SPPBase, ICallerSample2
  {
    private GYOUMU1Stub server = null;
    …
    public override void InitializeSPP()
    {
      // (1) クライアントスタブの生成
      server = new GYOUMU1Stub("SVGRP1");
    }
    public override void FinalizeSPP()
    {
      server = null;
    }
    [TP1RpcMethod]
    public string CallGETDATA1()
    {
      string ret;
      try {
        // (2) 入力用カスタムレコードの生成
        in_data inRecord = new in_data();
        // (2) 出力用カスタムレコードの生成
        out_data outRecord = new out_data();
        inRecord.i_basho[0] = 56;  // (3) 入力データの設定
        inRecord.i_basho[1] = 43;  // (3) 入力データの設定
        inRecord.i_basho[2] = 18;  // (3) 入力データの設定
        // (4) 同期応答型RPCに設定
        server.Flags = TP1ServerFlags.DCNOFLAGS;
        // (5) GETDATA1を呼び出す
        server.GETDATA1(inRecord, outRecord);
        // (6) 応答データの取り出し
        ret = outRecord.o_name.Trim();
        return ret;
      } catch (TP1UserException exp) {
        // GETDATA1()からユーザ例外がスローされた
      } catch (TP1RemoteException exp) {
        // GETDATA1()で予期しない例外発生
      } catch (TP1ServerException exp) {
        // OpenTP1(クラスライブラリ)が検知したエラー
      } catch (TP1Exception exp) {
        // その他OpenTP1が検知したエラー
      } catch (Exception exp) {
        // 予期しない例外
      }
    }
  }
}

(4) クライアントスタブの使用例(SPP.NET,J#の場合)

package MyCompany;
import System.*;
import Hitachi.OpenTP1.*;
import Hitachi.OpenTP1.Server.*;
 
public class CallerSample2Impl
       extends SPPBase implements ICallerSample2
{
    private GYOUMU1Stub server = null;
    …
    public void InitializeSPP() throws TP1ServerException
    {
      // (1) クライアントスタブの生成
      server = new GYOUMU1Stub("SVGRP1");
    }
    public void FinalizeSPP()
    {
      server = null;
    }
 
    /** @attribute TP1RpcMethod() */
    public String CallGETDATA1()
    {
      String ret;
      try {
        // (2) 入力用カスタムレコードの生成
        in_data inRecord = new in_data();
        // (2) 出力用カスタムレコードの生成
        out_data outRecord = new out_data();
        inRecord.get_i_basho()[0] = 56;  // (3) 入力データの設定
        inRecord.get_i_basho()[1] = 43;  // (3) 入力データの設定
        inRecord.get_i_basho()[2] = 18;  // (3) 入力データの設定
        // (4) 同期応答型RPCに設定
        server.set_Flags(TP1ServerFlags.DCNOFLAGS);
        // (5) GETDATA1を呼び出す
        server.GETDATA1(inRecord, outRecord);
        // (6) 応答データの取り出し
        ret = outRecord.get_o_name().trim();
        return ret;
      } catch (TP1UserException exp) {
        // GETDATA1()からユーザ例外がスローされた
      } catch (TP1RemoteException exp) {
        // GETDATA1()で予期しない例外発生
      } catch (TP1ServerException exp) {
        // OpenTP1(クラスライブラリ)が検知したエラー
      } catch (TP1Exception exp) {
        // その他OpenTP1が検知したエラー
      } catch (System.Exception exp) {
        // 予期しない例外
      }
    }
}

(5) クライアントスタブの使用例(SPP.NET,Visual Basicの場合)

Imports System
Imports Hitachi.OpenTP1
Imports Hitachi.OpenTP1.Server
 
Namespace MyCompany
  Public Class CallerSample2Impl
    Inherits SPPBase
    Implements ICallerSample2
    Private server As GYOUMU1Stub
    …
    Public Overrides Sub InitializeSPP()
      ' (1) クライアントスタブの生成
      server = New GYOUMU1Stub("SVGRP1")
    End Sub
    Public Overrides Sub FinalizeSPP()
      server = Nothing
    End Sub
    <TP1RpcMethod()> _
    Public Function CallGETDATA1 () As String _ 
      Implements ICallerSample2.CallGETDATA1
      Try
        Dim ret As String
        ' (2) 入力用カスタムレコードの生成
        Dim inRecord As in_data = New in_data()
        ' (2) 出力用カスタムレコードの生成
        Dim outRecord As out_data = New out_data()
        inRecord.i_basho(0) = 56  ' (3) 入力データの設定
        inRecord.i_basho(1) = 43  ' (3) 入力データの設定
        inRecord.i_basho(2) = 18  ' (3) 入力データの設定
        ' (4) 同期応答型RPCに設定
        server.Flags = TP1ServerFlags.DCNOFLAGS
        ' (5) GETDATA1を呼び出す
        server.GETDATA1(inRecord, outRecord)
        ' (6) 応答データの取り出し
        ret = outRecord.o_name.Trim()
      Catch exp As TP1UserException
        ' GETDATA1()からユーザ例外がスローされた
      Catch exp As TP1RemoteException
        ' GETDATA1()で予期しない例外発生
      Catch exp As TP1ServerException
        ' OpenTP1(クラスライブラリ)が検知したエラー
      Catch exp As TP1Exception
        ' その他OpenTP1が検知したエラー
      Catch exp As Exception
        ' 予期しない例外
      End Try
    End Function
  End Class
End Namespace

(6) クライアントスタブの使用例(SUP.NET,C#の場合)

using System;
using Hitachi.OpenTP1;
using Hitachi.OpenTP1.Server;
 
namespace MyCompany
{
  public class Caller2Sample
  {
    …
    public static void Main(string[] args)
    {
      try {
        // (1) クライアントスタブの生成
        GYOUMU1Stub server = new GYOUMU1Stub("SVGRP1");
        Rpc.Open();          // RPCオープン
        Adm.Complete();      // SUP.NET開始処理完了通知
 
        // (2) 入力用カスタムレコードの生成
        in_data inRecord = new in_data();
        // (2) 出力用カスタムレコードの生成
        out_data outRecord = new out_data();
        inRecord.i_basho[0] = 56;  // (3) 入力データの設定
        inRecord.i_basho[1] = 43;  // (3) 入力データの設定
        inRecord.i_basho[2] = 18;  // (3) 入力データの設定
        // (4) 同期応答型RPCに設定
        server.Flags = TP1ServerFlags.DCNOFLAGS;
        // (5)GETDATA1を呼び出す
        server.GETDATA1(inRecord, outRecord);
        // (6) 応答データの取り出し
        string name = outRecord.o_name.Trim();
 
        Rpc.Close();               // RPCクローズ
      } catch (TP1UserException exp) {
        // GETDATA1()からユーザ例外がスローされた
      } catch (TP1RemoteException exp) {
        // GETDATA1()で予期しない例外発生
      } catch (TP1ServerException exp) {
        // OpenTP1(クラスライブラリ)が検知したエラー
      } catch (TP1Exception exp) {
        // その他OpenTP1が検知したエラー
      } catch (Exception exp) {
        // 予期しない例外
      }
    }
  }
}

(7) クライアントスタブの使用例(SUP.NET,J#の場合)

package MyCompany;
import System.*;
import Hitachi.OpenTP1.*;
import Hitachi.OpenTP1.Server.*;
 
public class Caller2Sample
{
  …
    public static void main(String[] args)
    {
      try {
        String name;
        // (1) クライアントスタブの生成
        GYOUMU1Stub server = new GYOUMU1Stub("SVGRP1");
        Rpc.Open();          // RPCオープン
        Adm.Complete();      // SUP.NET開始処理完了通知
 
        // (2) 入力用カスタムレコードの生成
        in_data inRecord = new in_data();
        // (2) 出力用カスタムレコードの生成
        out_data outRecord = new out_data();
        inRecord.get_i_basho()[0] = 56;  // (3) 入力データの設定
        inRecord.get_i_basho()[1] = 43;  // (3) 入力データの設定
        inRecord.get_i_basho()[2] = 18;  // (3) 入力データの設定
        // (4) 同期応答型RPCに設定
        server.set_Flags(TP1ServerFlags.DCNOFLAGS);
        // (5) GETDATA1を呼び出す
        server.GETDATA1(inRecord, outRecord);
        // (6) 応答データの取り出し
        name = outRecord.get_o_name().trim();
 
        Rpc.Close();                     // RPCクローズ
      } catch (TP1UserException exp) {
        // GETDATA1()からユーザ例外がスローされた
      } catch (TP1RemoteException exp) {
        // GETDATA1()で予期しない例外発生
      } catch (TP1ServerException exp) {
        // OpenTP1(クラスライブラリ)が検知したエラー
      } catch (TP1Exception exp) {
        // その他OpenTP1が検知したエラー
      } catch (Exception exp) {
        // 予期しない例外
      }
    }
}

(8) クライアントスタブの使用例(SUP.NET,Visual Basicの場合)

Imports System
Imports Hitachi.OpenTP1
Imports Hitachi.OpenTP1.Server
 
Namespace MyCompany
  Public Class Caller2Sample
  …
    Public Shared Sub Main(ByVal args() As String)
      Dim name As String
      Dim inRecord As in_data
      Dim outRecord As out_data
      Try
        ' (1) クライアントスタブの生成
        Dim server As GYOUMU1Stub = _
                      New GYOUMU1Stub("SVGRP1")
        Rpc.Open()         ' RPCオープン
        Adm.Complete()     ' SUP.NET開始処理完了通知
 
        ' (2) 入力用カスタムレコードの生成
        inRecord = New in_data()
        ' (2) 出力用カスタムレコードの生成
        outRecord = New out_data()
        inRecord.i_basho(0) = 56  ' (3) 入力データの設定
        inRecord.i_basho(1) = 43  ' (3) 入力データの設定
        inRecord.i_basho(2) = 18  ' (3) 入力データの設定
        ' (4) 同期応答型RPCに設定
        server.Flags = TP1ServerFlags.DCNOFLAGS
        ' (5) GETDATA1を呼び出す
        server.GETDATA1(inRecord, outRecord)
        ' (6) 応答データの取り出し
        name = outRecord.o_name.Trim()
 
        Rpc.Close()               ' RPCクローズ
      Catch exp As TP1UserException
      ' GETDATA1()からユーザ例外がスローされた
      Catch exp As TP1RemoteException
      ' GETDATA1()で予期しない例外発生
      Catch exp As TP1ServerException
      ' OpenTP1(クラスライブラリ)が検知したエラー
      Catch exp As TP1Exception
      ' その他OpenTP1が検知したエラー
      Catch exp As Exception
      ' 予期しない例外
      End Try
    End Sub
  End Class
End Namespace