Oracle® Fusion Middleware Oracle WebLogic Server Oracle WebLogic Tuxedo Connectorアプリケーションの開発 12c (12.1.2) E48051-01 |
|
![]() 前 |
![]() 次 |
この章では、Oracle WebLogic ServerとOracle Tuxedo CORBAオブジェクトの間の相互運用性をサポートするOracle WebLogic Tuxedo Connectorを使用するために、アプリケーションを変更する方法について説明します。
この章の内容は以下のとおりです。
注意: CORBAを相互運用するOracle WebLogic Tuxedo Connectorを構成するには、いくつかの管理タスクを実行する必要があります。CORBAを相互運用するOracle WebLogic Tuxedo Connectorを管理する方法については、『Oracle WebLogic Server WebLogic 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オブジェクトへの参照を取得します。
// Get the simple factory.
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配布キットの 次の |
例4-1 サンプル・サービス・アプリケーション
. . . public String Toupper(String toConvert) throws RemoteException { log("toupper called, converting " + toConvert); try { // Initialize the 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"); // Get the simple factory. org.omg.CORBA.Object simple_fact_oref = orb.string_to_object("corbaname:tgiop:simpapp#simple_factory"); //Narrow the simple factory. SimpleFactory simple_factory_ref = SimpleFactoryHelper.narrow(simple_fact_oref); // Find the simple object. Simple simple = simple_factory_ref.find_simple(); // Convert the string to upper case. 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オブジェクトを取得します。
// String to Object. org.omg.CORBA.Object fact_finder_oref = orb.string_to_object("corbaloc:tgiop:simpapp/FactoryFinder"); // Narrow the factory finder. FactoryFinder fact_finder_ref = FactoryFinderHelper.narrow(fact_finder_oref); // Use the factory finder to find the simple factory. 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 WebLogic Server WLECのためのWebLogic Tuxedo Connector移行ガイド』を参照してください。
次のコードは、WTC ORBを呼び出し、FactoryFinderを使用してオブジェクト参照を取得する方法の例です。
例4-2 サンプルFactoryFinderコード
. . . public ConverterResult convert (String changeCase, String mixed) throws ProcessingErrorException { String result; try { // Initialize the 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"); // Narrow the factory finder. 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()); // Narrow the simple factory. SimpleFactory simple_factory_ref = SimpleFactoryHelper.narrow(simple_fact_oref); // Find the simple object. Simple simple = simple_factory_ref.find_simple(); if (changeCase.equals("UPPER")) { // Invoke the to_upper opeation on M3 Simple object 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 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 WebLogic Server WebLogic Tuxedo Connectorの管理』のCorbaアプリケーションの管理に関する項で説明されているcnsbind
コマンドで指定されたバインド名です。
例4-3 ネーミング・コンテキストを取得するサンプル・コード
. . . // obtain a naming context 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(); // Lookup a EJB-like CORBA server in a remote CORBA domain 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アプリケーションでのトランザクションの管理の詳細は、 |
Oracle WebLogic Tuxedo Connectorは、Java Transaction API (JTA)を使って、Oracle Tuxedo CORBAアプリケーションでのトランザクションを管理します。詳細については、以下を参照してください。
『Oracle WebLogic Server JTAアプリケーションの開発』
『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1の開発』のトランザクションの設計と管理のオプションに関する項