Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第5章 アプリケーションの開発(Java言語)> 5.13 サーバアプリケーションのプログラミング (動的スケルトンインタフェース:DSI)

5.13.4 ゲートウェイの処理

 ゲートウェイでは、以下に示す処理を行います。

 ゲートウェイの実装例を以下に示します。

【ゲートウェイ実装例】

  class DsiServant 
  extends org.omg.PortableServer.DynamicImplementation {

      public void
      invoke(org.omg.CORBA.ServerRequest req) 
      {
          org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();

          String name = req.operation(); //1メソッド名の取得
          if (name.equals("add"))          //メソッド名の解析
          {

              //2パラメタリストの設定
              //パラメタリストの作成
              org.omg.CORBA.NVList args = orb.create_list(2); 
              //パラメタ情報の登録
              org.omg.CORBA.Any _a = orb.create_any();
              _a.type(orb.get_primitive_tc(
                  org.omg.CORBA.TCKind.tk_long)); 
              args.add_value("a", _a, org.omg.CORBA.ARG_IN.value); 
              org.omg.CORBA.Any _b = orb.create_any();
              _b.type(orb.get_primitive_tc(
                  org.omg.CORBA.TCKind.tk_long)); 
              args.add_value("b", _b, org.omg.CORBA.ARG_IN.value); 

              //3パラメタの解析
              req.arguments(args); 
              int a = _a.extract_long();
              int b = _b.extract_long();

              //処理部の起動
              org.omg.CORBA.IntHolder ret = new org.omg.CORBA.IntHolder();
              UserMethod um = new UserMethod();
              ret.value = um.method1(a, b); 

              //4復帰情報の設定
              org.omg.CORBA.Any _ret = orb.create_any();
              _ret.type(orb.get_primitive_tc(
                  org.omg.CORBA.TCKind.tk_long)); 
              _ret.insert_long(ret.value); 
              req.set_result(_ret); 
              return; 
          }
          throw (new org.omg.CORBA.BAD_OPERATION(
              0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE)); 
      }

      //5実装が必要なメソッド
      public java.lang.String[] _all_interfaces(
          org.omg.PortableServer.POA poa, 
          byte[] objectId) {
          return ids; 
      }
      private static java.lang.String[] ids = {"IDL:ODsample/intf:1.0"};
  }

  //処理部
  class UserMethod
  {
      public int method1( int a, int b ){ 
          //必要な処理を記述
          return( a + b ); 
      }
  }

 ゲートウェイを実装するServantオブジェクトは、org.omg.PortableServer.DynamicImplementationを継承するものとして作成します。また、クライアントからのリクエストに対して起動されるメソッドとしてinvoke()メソッドを実装します。起動の際、invoke()の引数としてServerRequestクラスのオブジェクト(上記例ではreq)が渡されます。

【ゲートウェイServantの必須メソッド(1)】

  public void invoke(org.omg.CORBA.ServerRequest req)

(1)メソッドの取得と解析

 渡されたServerRequestクラスに登録されているオペレーション名をorg.omg.CORBA.ServerRequest.operation()メソッドにより取得します。

(2)パラメタの組立て

(3)パラメタの解析

 生成したNVListオブジェクトを引数としてorg.omg.ServerRequest.arguments()メソッドを呼び出します。この結果、アプリケーションに渡すパラメタ値が取得されます。

(4)復帰情報の設定

 org.omg.CORBA.ServerRequest.set_result()メソッドを発行して復帰情報の設定を行います。

(5)その他実装が必要なメソッド

 ゲートウェイを実装するServantはOMG規約上_all_interfaces()メソッドを実装しておく必要があります。上記の例のように、org.omg.PortableServer.POAクラスのオブジェクト、byte配列オブジェクトを引数とし、インタフェースリポジトリID相当の文字列("IDL:xxx:1.0")を最初の要素に持つString配列オブジェクトを戻り値とする形式で実装します。引数の値をメソッド内部で扱う必要は特にありません。

【ゲートウェイServantの必須メソッド(2)】

  public java.lang.String[] _all_interfaces(
            org.omg.PortableServer.POA poa,
            byte[] objectId)

目次 索引 前ページ次ページ

Copyright 2005 FUJITSU LIMITED