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

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

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

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

<この項の構成>
(1) サービス定義の定義例(C#の場合)
(2) カスタムレコードクラスの出力例(C#の場合,in_data.cs)
(3) クライアントスタブの使用例(SPP.NET,C#の場合)
(4) クライアントスタブの使用例(SPP.NET,J#の場合)
(5) クライアントスタブの使用例(SPP.NET,Visual Basicの場合)
(6) クライアントスタブの使用例(SUP.NET,C#の場合)
(7) クライアントスタブの使用例(SUP.NET,J#の場合)
(8) クライアントスタブの使用例(SUP.NET,Visual Basicの場合)

(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