WebLogic Tuxedo Connector プログラマーズ ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

RMI/IIOP および CORBA を相互に運用する WebLogic Tuxedo Connector の使用

注意 : CORBA を相互運用する WebLogic Tuxedo Connector をコンフィグレーションするには、いくつかの管理タスクを実行する必要があります。CORBA を相互運用する WebLogic Tuxedo Connector を管理する方法については、「CORBA アプリケーションの管理」を参照してください。
注意 : Tuxedo CORBA アプリケーションを開発する方法については、『CORBA プログラミング』を参照してください。

以下の節では、WebLogic Server と Tuxedo CORBA オブジェクトの間の相互運用性をサポートする WebLogic Tuxedo Connector を使用するために、アプリケーションを変更する方法について説明します。

 


CORBA Java API を用いて WebLogic Tuxedo Connector クライアント Bean を開発する方法

WebLogic Tuxedo Connector を使うと、オブジェクト (たとえば EJB や RMI オブジェクト) は、CORBA Java API (発信) を用いて、Tuxedo にデプロイされた CORBA オブジェクトを呼び出すことができます。WebLogic Tuxedo Connector では、WebLogic Server RMI-IIOP 実行時環境を使用して CORBA をサポートする WTC ORB を実装しています。この拡張では次のような機能が提供されます。

CORBA Java API を使用するには、WTC ORB を使用する必要があります。以下のいずれかのメソッドを使用して、Bean で ORB を取得します。

Properties Prop;
Prop = new Properties();
Prop.put("org.omg.CORBA.ORBClass","weblogic.wtc.corba.ORB");
ORB orb = ORB.init(new String[0], Prop);

または

ORB orb = (ORB)(new InitialContext().lookup("java:comp/ORB"));

または

ORB orb = ORB.init();

Tuxedo にデプロイされているオブジェクトを参照するには、以下のいずれかの方法を使用できます。

CosNaming Service を使用する

注意 : オブジェクト参照の詳細については、「FederationURL フォーマットの使用方法」を参照してください。
  1. WebLogic Tuxedo Connector は、リモート Tuxedo CORBA ドメインにあるオブジェクトへの参照を取得するために、CosNaming サービスを使用します。これは、corbaloc:tgiop または corbaname:tgiop オブジェクト参照を使用して行います。次の文は、CosNaming サービスを使用して Tuxedo CORBA オブジェクトへの参照を取得します。
  2. // simple ファクトリを取得する
    org.omg.CORBA.Object simple_fact_oref =
         orb.string_to_object("corbaname:tgiop:simpapp#simple_factory");

各値の説明は次のとおりです。

サンプル ToupperCorbaBean.java コード

注意 : 発信 Tuxedo CORBA オブジェクト用のクライアント Bean を開発する方法の例については、WebLogic Server 配布キットのサンプルの SAMPLES_HOME\server\examples\src\examples\wtc\corba\simpappcns パッケージを参照してください。

次の ToupperCorbaBean.java コードは、WTC ORB を呼び出し、COSNaming サービスを使用してオブジェクト参照を取得する方法の例です。

コード リスト 4-1 サンプル サービス アプリケーション
.
.
.
public String Toupper(String toConvert)
throws RemoteException
{
      log("toupper called, converting " + toConvert);

     try {
        // ORB を初期化
        String args[] = null;
         Properties Prop;
        Prop = new Properties();
        Prop.put("org.omg.CORBA.ORBClass",
                "weblogic.wtc.corba.ORB");

        ORB orb = (ORB) new InitialContext().lookup("java:comp/ORB");

        // simple ファクトリを取得
        org.omg.CORBA.Object simple_fact_oref =
        orb.string_to_object("corbaname:tgiop:simpapp#simple_factory");

        // simple ファクトリをナロー変換
        SimpleFactory simple_factory_ref =
        SimpleFactoryHelper.narrow(simple_fact_oref);

        // simple オブジェクトを見つける
        Simple simple = simple_factory_ref.find_simple();

        // 文字列を大文字に変換する
        org.omg.CORBA.StringHolder buf =
          new org.omg.CORBA.StringHolder(toConvert);
        simple.to_upper(buf);
        return buf.value;
     }
     catch (Exception e) {
        throw new RemoteException("Can't call TUXEDO CORBA server: " +e);
     }
}
.
.
.

FactoryFinder を使用する

注意 : オブジェクト参照の詳細については、「FederationURL フォーマットの使用方法」を参照してください。

WebLogic Tuxedo Connector では、find_one_factory_by_id メソッドを使用して FactoryFinder オブジェクトをサポートしています。これは、corbaloc:tgiop または corbaname:tgiop オブジェクト参照を使用して行います。次のメソッドで、ORB を使用して FactoryFinder オブジェクトを取得します。

// 文字列をオブジェクトに変換
org.omg.CORBA.Object fact_finder_oref =
     orb.string_to_object("corbaloc:tgiop:simpapp/FactoryFinder");

// ファクトリ ファインダをナロー変換
FactoryFinder fact_finder_ref =
     FactoryFinderHelper.narrow(fact_finder_oref);

// ファクトリ ファインダを使用して simple ファクトリを見つける
org.omg.CORBA.Object simple_fact_oref =
     fact_finder_ref.find_one_factory_by_id(SimpleFactoryHelper.id());

各値の説明は次のとおりです。

WLEC から WebLogic Tuxedo Connector への移行

WLEC は、WebLogic Server では使用できなくなり、サポートされなくなりました。WLEC ユーザはアプリケーションを WebLogic Tuxedo Connector に移行することをお勧めします。詳細については、『WebLogic Tuxedo Connector 移行ガイド』を参照してください。

サンプル コード

次の ToupperCorbaBean.java コードは、WTC ORB を呼び出し、FactoryFinder を使用してオブジェクト参照を取得する方法の例です。

コード リスト 4-2 サンプル FactoryFinder コード
.
.
.
public ConverterResult convert (String changeCase, String mixed)
throws ProcessingErrorException
{
     String result;
     try {
     // ORB を初期化
     String args[] = null;
     Properties Prop;
     Prop = new Properties();
     Prop.put("org.omg.CORBA.ORBClass","weblogic.wtc.corba.ORB");
     ORB orb = (ORB)new InitialContext().lookup("java:comp/ORB");

     org.omg.CORBA.Object fact_finder_oref =
         orb.string_to_object("corbaloc:tgiop:simpapp/FactoryFinder");

     // ファクトリ ファインダをナロー変換
     FactoryFinder fact_finder_ref =
        FactoryFinderHelper.narrow(fact_finder_oref);

     // find_one_factory_by_id
     org.omg.CORBA.Object simple_fact_oref =
        fact_finder_ref.find_one_factory_by_id(FactoryFinderHelper.id());

     // simple ファクトリをナロー変換
     SimpleFactory simple_factory_ref =
        SimpleFactoryHelper.narrow(simple_fact_oref);

     // simple オブジェクトを見つける
     Simple simple = simple_factory_ref.find_simple();

     if (changeCase.equals("UPPER")) {
     // M3 Simple オブジェクトの to_upper 操作を呼び出す
     org.omg.CORBA.StringHolder buf =
        new org.omg.CORBA.StringHolder(mixed);
     simple.to_upper(buf);
     result = buf.value;
     }
     else
     {
     result = simple.to_lower(mixed);
     }

     }
     catch (org.omg.CORBA.SystemException e) {e.printStackTrace();

     throw new ProcessingErrorException("Converter error: Corba system exception: " + e);
     }
     catch (Exception e) {
     e.printStackTrace();
     throw new ProcessingErrorException("Converter error: " + e);
     }
return new ConverterResult(result);
}
.
.
.

 


WebLogic Tuxedo Connector 用の RMI/IIOP アプリケーションを開発する方法

注意 : RMI/IIOP アプリケーションを開発する方法の詳細については、『WebLogic RMI プログラマーズ ガイド』を参照してください。

RMI over IIOP (Internet Inter-ORB Protocol) は、Java プログラムが CORBA (Common Object Request Broker Architecture) クライアントと対話して CORBA オブジェクトを実行できるように、RMI を拡張しています。WebLogic Tuxedo Connector は次のことを可能にします。

次の節では、Tuxedo CORBA アプリケーションと対話する WebLogic Tuxedo Connector を使用するために、RMI/IIOP アプリケーションを修正する方法に関する情報を提供します。

WebLogic Tuxedo Connector を使用するために着信 RMI/IIOP アプリケーションを変更する方法

クライアントは、COSNaming Service にバインドされている WebLogic Server のネーム サービスの正しいバインド名を COSNaming Service に渡す必要があります。

次のコードは、ネーミング コンテキストを取得する例です。「WLS」は、「CORBA アプリケーションの管理」で説明されている cnsbind コマンドで指定されたバインド名です。

コード リスト 4-3 ネーミング コンテキストを取得するサンプル コード
.
.
.
// ネーミング コンテキストを取得
     TP::userlog("Narrowing to a naming context");
     CosNaming::NamingContext_var context =
          CosNaming::NamingContext::_narrow(o);
     CosNaming::Name name;
     name.length(1);
     name[0].id = CORBA::string_dup("WLS");
     name[0].kind = CORBA::string_dup("");
.
.
.

WebLogic Tuxedo Connector を使用するために発信 RMI/IIOP アプリケーションを開発する方法

EJB は、リモート Tuxedo CORBA オブジェクトにアクセスする目的で使用される初期コンテキストを取得するために FederationURL を使用する必要があります。WebLogic Tuxedo Connector を使用するために発信 RMI/IIOP アプリケーションを修正する方法を次の節で説明します。

FederationURL を EJB に渡すために ejb-jar.xml ファイルを修正する方法

次のコードは、実行時に FederationURL フォーマットを EJB に渡すために ejb-jar.xml ファイルをコンフィグレーションする方法の例です。

コード リスト 4-4 FederationURL を EJB に渡すサンプル ejb-jar.xml ファイル
<?xml version="1.0"?>

<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN' 'http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'>

<ejb-jar>
     <small-icon>images/green-cube.gif</small-icon>
     <enterprise-beans>
     <session>
          <small-icon>images/orange-cube.gif</small-icon>
          <ejb-name>IIOPStatelessSession</ejb-name>
          <home>examples.iiop.ejb.stateless.TraderHome</home>
          <remote>examples.iiop.ejb.stateless.Trader</remote>
          <ejb-class>examples.iiop.ejb.stateless.TraderBean</ejb-class>
          <session-type>Stateless</session-type>
          <transaction-type>Container</transaction-type>
          <env-entry>
               <env-entry-name>foreignOrb</env-entry-name>
               <env-entry-type>java.lang.String </env-entry-type>
               <env-entry-value>corbaloc:tgiop:simpapp</env-entry-value>
          </env-entry>
          <env-entry>
               <env-entry-name>WEBL</env-entry-name>
               <env-entry-type>java.lang.Double </env-entry-type>
               <env-entry-value>10.0</env-entry-value>
          </env-entry>
          <env-entry>
               <env-entry-name>INTL</env-entry-name>
               <env-entry-type>java.lang.Double </env-entry-type>
               <env-entry-value>15.0</env-entry-value>
          </env-entry>
          <env-entry>
               <env-entry-name>tradeLimit</env-entry-name>
               <env-entry-type>java.lang.Integer </env-entry-type>
               <env-entry-value>500</env-entry-value>
          </env-entry>
     </session>
     </enterprise-beans>
     <assembly-descriptor>
          <container-transaction>
               <method>
                    <ejb-name>IIOPStatelessSession</ejb-name>
                    <method-intf>Remote</method-intf>
                    <method-name>*</method-name>
               </method>
          <trans-attribute>NotSupported</trans-attribute>
          </container-transaction>
     </assembly-descriptor>
</ejb-jar>

実行時に FederationURL を EJB に渡すには、アプリケーションの ejb-jar.xml ファイルにその EJB 用の env-entry を追加します。次の env-entry 下位要素を割り当てる必要があります。

env-entry-name の割り当て

env-entry-name 要素は、env-entry-value 要素内の値を EJB に渡すために使われる変数の名前を指定するために使用されます。コード リスト 4-4 で示したサンプル コードでは、env-entry-nameforeignOrb と指定しています。

env-entry-type の割り当て

env-entry-type 要素は、EJB に渡される env-entry-value 要素のデータ型 (たとえば String、Integer、Double) を指定するために使用されます。コード リスト 4-4 で示したサンプル コードでは、foreignOrb 変数が String データを EJB に渡しています。

env-entry-value の割り当て

env-entry-value 要素は、EJB に渡されるデータを指定するために使用されます。コード リスト 4-4 で示したサンプル コードでは、foreignOrb 変数が次の FederationURL フォーマットで EJB に渡すということを指定しています。

corbaloc:tgiop:simpapp

ここで、simpapp とは、Tuxedo UBB で指定されている Tuxedo リモート サービスの DOMAINID です。

オブジェクトにアクセスするための FederationURL を使用するために EJB を変更する方法

この節では、リモート Tuxedo CORBA オブジェクトにアクセスするために使用される InitialContext を取得するための FederationURL を使用する方法に関する情報を提供します。

次のコードは InitialContext を取得するための FederationURL の使い方の例です。

コード リスト 4-5 InitialContext を取得するためのサンプル TraderBean.java コード
.
.
.
public void createRemote() throws CreateException {
     log("createRemote() called");

     try {
          InitialContext ic = new InitialContext();

     // リモート CORBA ドメインで EJB に似た CORBA サーバをルックアップする
          Hashtable env = new Hashtable();
          env.put(Context.PROVIDER_URL, (String)
             ic.lookup("java:/comp/env/foreignOrb")
             + "/NameService");

          InitialContext cos = new InitialContext(env);
          TraderHome thome =
             (TraderHome)PortableRemoteObject.narrow(
             cos.lookup("TraderHome_iiop"),TraderHome.class);
             remoteTrader = thome.create();
}
     catch (NamingException ne) {
     throw new CreateException("Failed to find value "+ne);
}
     catch (RemoteException re) {
     throw new CreateException("Error creating remote ejb "+re);
}
}
.
.
.

リモート Tuxedo CORBA オブジェクトの InitinalContext を取得する FederationURL を使用するための手順を以下に示します。

  1. ejb-jar.xml ファイルで定義されている FederationURL フォーマットを取り出します。
  2. 例 :

    "ic.lookup("java:/comp/env/foreignOrb")

    コード リスト 4-4 で示したサンプル コードでは、foreignOrb 変数が次の FederationURL フォーマットで EJB に渡すということを指定しています。

    corbaloc:tgiop:simpapp

  3. /NameService」という FederationURL フォーマットを、先の FederationURL に連結します。
  4. 例 :

    "ic.lookup("java:/comp/env/foreignOrb") + "/NameService"

    連結結果の FederationURL は次のとおりです。

    corbaloc:tgiop:simpapp/NameService

  5. InitialContext を取得します。
  6. 例 :

    env.put(Context.PROVIDER_URL, (String)
         ic.lookup("java:/comp/env/foreignOrb") + "/NameService");
    InitialContext cos = new InitialContext(env);

    実行結果は Tuxedo CORBA オブジェクトの InitialContext です。

 


FederationURL フォーマットの使用方法

この節では、以下の FederationURL フォーマットの構文に関する情報を提供します。

corbaloc URL フォーマットの使用

この節では、corbaloc URL フォーマットの構文を示します。

<corbaloc> = "corbaloc:tgiop":[<version>] <domain>["/"<key_string>]
<version> = <major> "." <minor> "@" | empty_string
<domain> = TUXEDO CORBA domain name
<major> = number
<minor> = number
<key_string> = <string> | empty_string

corbaloc:tgiop の例

この節では、corbaloc:tgiop の使用例を示します。

orb.string_to_object("corbaloc:tgiop:simpapp/NameService");
orb.string_to_object("corbaloc:tgiop:simpapp/FactoryFinder");
orb.string_to_object("corbaloc:tgiop:simpapp/InterfaceRepository");
orb.string_to_object("corbaloc:tgiop:simpapp/Tobj_SimpleEventsService");
orb.string_to_object("corbaloc:tgiop:simpapp/NotificationService");
orb.string_to_object("corbaloc:tgiop:1.1@simpapp/NotificationService);

-ORBInitRef の使用例

orb.init および resolve_initial_reference-ORBInitRef オプションを使用することもできます。

次の -ORBInitRef 定義を指定します。

-ORBInitRef FactoryFinder=corbaloc:tgiop:simp/FactoryFinder
-ORBInitRef InterfaceRepository=corbaloc:tgiop:simp/InterfaceRepository
-ORBInitRef Tobj_SimpleEventService=corbaloc:tgiop:simp/Tobj_SimpleEventsService
-ORBInitRef NotificationService=corbaloc:tgiop:simp/NotificationService

次に、

orb.resolve_initial_references("NameService");
orb.resolve_initial_references("FactoryFinder");
orb.resolve_initial_references("InterfaceRepository");
orb.resolve_initial_references("Tobj_SimpleEventService");
orb.resolve_initial_references("NotificationService");

-ORBDefaultInitRef の使用例

-ORBDefaultInitRef および resolve_initial_reference を使用できます。

次の -ORBDefaultInitRef 定義を指定します。

-ORBDefaultInitRef corbaloc:tgiop:simpapp

次に、

orb.resolve_initial_references("NameService");

corbaname URL フォーマットの使用

corbaloc フォーマットの代わりに corbaname フォーマットを使用することもできます。

-ORBInitRef の使用例

次の -ORBInitRef 定義を指定します。

-ORBInitRef NameService=corbaloc:tgiop:simpapp/NameService
次に、
orb.string_to_object("corbaname:rir:#simple_factory");
orb.string_to_object("corbaname:tgiop:simpapp#simple_factory");
orb.string_to_object("corbaname:tgiop:1.1@simpapp#simple_factory");
orb.string_to_object("corbaname:tgiop:simpapp#simple/simple_factory");

 


Tuxedo CORBA アプリケーションに対するトランザクションを管理する方法

注意 : Tuxedo CORBA アプリケーションでトランザクションを管理する方法の詳細については、「トランザクションについて」を参照してください。

WebLogic Tuxedo Connector は、Java Transaction API (JTA) を使って、Tuxedo CORBA アプリケーションでのトランザクションを管理します。詳細については、以下を参照してください。


ページの先頭       前  次