Oracle® Middleware Oracle WebLogic Server Tuxedo Connector プログラマーズ ガイド 11g リリース 1 (10.3.1) B55532-01 |
|
![]() 戻る |
![]() 次へ |
以下の節では、Oracle WebLogic Server と Oracle Tuxedo CORBA オブジェクトの間の相互運用性をサポートする Oracle WebLogic Tuxedo Connector を使用するために、アプリケーションを変更する方法について説明します。
CORBA Java API を用いて Oracle WebLogic Tuxedo Connector クライアント Bean を開発する方法
Oracle WebLogic Tuxedo Connector 用の RMI/IIOP アプリケーションを開発する方法
注意 : CORBA を相互運用する Oracle WebLogic Tuxedo Connector をコンフィグレーションするには、いくつかの管理タスクを実行する必要があります。CORBA を相互運用する Oracle WebLogic Tuxedo Connector を管理する方法については、『Oracle Fusion Middleware Oracle WebLogic Server Tuxedo Connector 管理ガイド』の「Corba アプリケーションの管理」を参照してください。Oracle Tuxedo CORBA アプリケーションを開発する方法については、 |
Oracle WebLogic Tuxedo Connector を使うと、オブジェクト (たとえば EJB や RMI オブジェクト) は、CORBA Java API (発信) を用いて、Oracle Tuxedo にデプロイされた CORBA オブジェクトを呼び出すことができます。Oracle WebLogic Tuxedo Connector では、Oracle WebLogic Server RMI-IIOP 実行時環境を使用して CORBA をサポートする WTC ORB を実装しています。この拡張では次のような機能が提供されます。
出力および入力パラメータのサポート
トランザクションおよびセキュリティを使用した Oracle WebLogic Server から CORBA サービスへの呼び出しのサポート
旧リリースで使用されていた JDK ORB のインスタンスではなく、JNDI でホストされる ORB のサポート
既存のアプリケーションを変更せずに、レガシー アプリケーションのユーザが新しい ORB を使用できるようにするためのラッパー。以下を実行する代わりに、ORB を JNDI でルックアップする新しい方法に移行することをお勧めします。
ORB orb = ORB.init(args, Prop);
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();
Oracle Tuxedo にデプロイされているオブジェクトを参照するには、以下のいずれかの方法を使用できます。
Oracle WebLogic Tuxedo Connector は、リモート Oracle Tuxedo CORBA ドメインにあるオブジェクトへの参照を取得するために、CosNaming サービスを使用します。これは、corbaloc:tgiop
または corbaname:tgiop
オブジェクト参照を使用して行います。次の文は、CosNaming サービスを使用して Oracle Tuxedo CORBA オブジェクトへの参照を取得します。
// simple ファクトリを取得する
org.omg.CORBA.Object simple_fact_oref =
orb.string_to_object("corbaname:tgiop:simpapp#simple_factory");
各値の説明は次のとおりです。
simpapp
は、Oracle Tuxedo UBB に指定された Oracle Tuxedo ドメインのドメイン ID。
simple_factory
は、Oracle Tuxedo CORBA CosNaming サーバにおいてオブジェクト参照がバインドされていた名前。
注意 : 発信 Oracle Tuxedo CORBA オブジェクト用のクライアント Bean を開発する方法の例については、Oracle WebLogic Server 配布キットのサンプルのSAMPLES_HOME \server\examples\src\examples\wtc\corba\simpappcns パッケージを参照してください。
次の |
コード リスト 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); } } . . .
Oracle 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());
各値の説明は次のとおりです。
simpapp
は、Oracle Tuxedo UBB に指定された Oracle Tuxedo ドメインのドメイン ID。
FactoryFinder
は、Oracle Tuxedo CORBA サーバにおいてオブジェクト参照がバインドされていた名前。
WLEC は、Oracle WebLogic Server では使用できなくなり、サポートされなくなりました。WLEC ユーザはアプリケーションを Oracle WebLogic Tuxedo Connector に移行することをお勧めします。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server 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); } . . .
注意 : RMI/IIOP アプリケーションを開発する方法の詳細については、『Oracle Fusion Middleware Oracle WebLogic Server RMI プログラマーズ ガイド』を参照してください。 |
RMI over IIOP (Internet Inter-ORB Protocol) は、Java プログラムが CORBA (Common Object Request Broker Architecture) クライアントと対話して CORBA オブジェクトを実行できるように、RMI を拡張しています。Oracle WebLogic Tuxedo Connector は次のことを可能にします。
Oracle Tuxedo CORBA オブジェクトが、Oracle WebLogic Server (着信) にデプロイされた EJB を呼び出すことができます。
オブジェクト (EJB または RMI オブジェクトなど) が、Oracle Tuxedo (発信) にデプロイされた CORBA オブジェクトを呼び出すことができます。
次の節では、Oracle Tuxedo CORBA アプリケーションと対話する Oracle WebLogic Tuxedo Connector を使用するために、RMI/IIOP アプリケーションを修正する方法に関する情報を提供します。
Oracle WebLogic Tuxedo Connector を使用するために着信 RMI/IIOP アプリケーションを変更する方法
Oracle WebLogic Tuxedo Connector を使用するために発信 RMI/IIOP アプリケーションを開発する方法
クライアントは、COSNaming Service にバインドされている Oracle WebLogic Server のネーム サービスの正しいバインド名を COSNaming Service に渡す必要があります。
次のコードは、ネーミング コンテキストを取得する例です。「WLS」は、『Oracle Fusion Middleware Oracle WebLogic Server Tuxedo Connector 管理ガイド』の「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(""); . . .
EJB は、リモート Oracle Tuxedo CORBA オブジェクトにアクセスする目的で使用される初期コンテキストを取得するために FederationURL を使用する必要があります。Oracle WebLogic Tuxedo Connector を使用するために発信 RMI/IIOP アプリケーションを修正する方法を次の節で説明します。
次のコードは、実行時に 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-value
要素内の値を EJB に渡すために使われる変数の名前を指定するために使用されます。コード リスト 4-4 で示したコード例では、env-entry-name
を foreignOrb
と指定しています。
env-entry-type
要素は、EJB に渡される env-entry-value
要素のデータ型 (たとえば String、Integer、Double) を指定するために使用されます。コード リスト 4-4 に示したサンプル コードでは、foreignOrb
変数が String
データを EJB に渡しています。
env-entry-value
要素は、EJB に渡されるデータを指定するために使用されます。コード リスト 4-4 に示したサンプル コードでは、foreignOrb
変数が次の FederationURL フォーマットで EJB に渡すということを指定しています。
corbaloc:tgiop:simpapp
simpapp
とは、Oracle Tuxedo UBB で指定されている Oracle Tuxedo リモート サービスの DOMAINID
です。
この節では、リモート Oracle 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); } } . . .
リモート Oracle Tuxedo CORBA オブジェクトの InitialContext を取得する FederationURL を使用するための手順を以下に示します。
ejb-jar.xml
ファイルで定義されている FederationURL フォーマットを取り出します。
例 :
"ic.lookup("java:/comp/env/foreignOrb")
コード リスト 4-4 に示したサンプル コードでは、foreignOrb
変数が次の FederationURL フォーマットで EJB に渡すということを指定しています。
corbaloc:tgiop:simpapp
「/NameService
」という FederationURL フォーマットを、先の FederationURL に連結します。
例
"ic.lookup("java:/comp/env/foreignOrb") + "/NameService"
連結結果の FederationURL は次のとおりです。
corbaloc:tgiop:simpapp/NameService
InitialContext を取得します。
例 :
env.put(Context.PROVIDER_URL, (String) ic.lookup("java:/comp/env/foreignOrb") + "/NameService"); InitialContext cos = new InitialContext(env);
実行結果は Oracle Tuxedo CORBA オブジェクトの InitialContext です。
この節では、以下の FederationURL フォーマットの構文に関する情報を提供します。
CORBA URL
構文は CORBA 仕様で記述されます。詳細については、(http://www.omg.org/
) にある OMG の Web サイトを参照してください。
corbaloc:tgiop
フォームは、Oracle tgiop プロトコル専用です。
この節では、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
の使用例を示します。
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);
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");
corbaloc
フォーマットの代わりに corbaname
フォーマットを使用することもできます。
次の -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");
注意 : Oracle Tuxedo CORBA アプリケーションでトランザクションを管理する方法の詳細については、(http://download.oracle.com/docs/cd/E13203_01/tuxedo/tux100/trans/gstrx.html ) にある『CORBA トランザクションの使用』の「トランザクションについて」を参照してください。 |
Oracle WebLogic Tuxedo Connector は、Java Transaction API (JTA) を使って、Oracle Tuxedo CORBA アプリケーションでのトランザクションを管理します。詳細については、以下を参照してください。
Oracle Fusion Middleware Oracle WebLogic Server JTA プログラマーズ ガイド
『Oracle Fusion Middleware Oracle WebLogic Server Enterprise JavaBeans プログラマーズ ガイド』の「トランザクションの設計と管理のオプション」