BEA Home | Events | Solutions | Partners | Products | Services | Download | Developer Center | WebSUPPORT
| WebLogic Server Doc Home | WebLogic Tuxedo Connector Programmer's Guide | Previous Topic | Next Topic | Contents | View as PDF

Using WebLogic Tuxedo Connector for RMI/IIOP and Corba Interoperability

Note: You will need to perform some administration tasks to configure the WebLogic Tuxedo Connector for CORBA interoperability. For information on how to administer the WebLogic Tuxedo Connector for CORBA interoperability, see the WebLogic Tuxedo Connector Programmer's Guide.

The WebLogic Tuxedo Connector provides bi-directional interoperability between WebLogic Server and Tuxedo CORBA objects. The WebLogic Tuxedo Connector:

- Enables Tuxedo CORBA objects to invoke upon EJBs deployed in WebLogic Server using the RMI/IIOP API (Inbound).

- Enables objects (such as EJBs or RMI objects) to invoke upon CORBA objects deployed in Tuxedo using a CORBA Java API (Outbound).

The following sections provide information on how to modify your applications to use WebLogic Tuxedo Connector to support interoperability between WebLogic Server and Tuxedo CORBA objects:

- How to Develop WebLogic Tuxedo Connector Client Beans for Tuxedo CORBA Objects

- How to Modify Inbound RMI/IIOP Applications to use the WebLogic Tuxedo Connector

- How to Modify Outbound RMI/IIOP Applications to use the WebLogic Tuxedo Connector

- How to Use FederationURL Formats

- How to Manage Transactions for Tuxedo CORBA Applications

How to Develop WebLogic Tuxedo Connector Client Beans for Tuxedo CORBA Objects

Note: For an example on how to develop client beans for outbound Tuxedo CORBA objects, see the examples/wtc/corba/simpappcns package in your WebLogic Server distribution

Use the following steps when developing your EJB that will invoke on CORBA objects deployed in Tuxedo:

- Use the WTC ORB

- Get Object References

- Invoke on the Object

Use the WTC ORB

To use CORBA with the WebLogic Tuxedo Connector, you must use the WTC ORB. Use the following statement to instantiate the WTC ORB in your Bean:

>                 Prop.put("org.omg.CORBA.ORBClass",
>                                               "weblogic.wtc.corba.ORB");

Get Object References

Note: For more information on object references, see How to Use FederationURL Formats.

The WebLogic Tuxedo Connector uses the CosNaming service to get a reference to an object in the remote Tuxedo CORBA domain. This is accomplished by using a corbaloc:tgiop or corbaname:tgiop object reference. The following statements use the CosNaming service to get a reference to a Tuxedo Corba Object:

>               // Get the simple factory.
>                         org.omg.CORBA.Object simple_fact_oref =
>                                   orb.string_to_object("corbaname:tgiop:simpapp#simple_factory");

Where:

- simpapp is the domain id of the Tuxedo domain specified in the Tuxedo UBB.

- simple_factory is the name that the object reference was bound to in the CosNaming server in Tuxedo CORBA.

Invoke on the Object

Perform your task by invoking upon the CORBA object deployed in Tuxedo using a CORBA Java API.

Example ToupperCorbaBean.java Code

The following ToupperCorbaBean.java code provides an example of how to call the WTC ORB and get an object reference using the COSNaming Service.

Listing 4-1 Example Service Application

>     .
>     .
>     .
>     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.init(args, Prop);

>                     // 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);
>               }
>     }
>     .
>     .
>     .

How to Modify Inbound RMI/IIOP Applications to use the WebLogic Tuxedo Connector

Note: For an example on how to develop an inbound RMI/IIOP C++ client, see the examples/iiop/ejb/stateless/server/tux package in your WebLogic Server distribution

The only WebLogic Tuxedo Connector programming requirement is that the client must pass the correct name to which the WebLogic Server's name service has been bound to the COSNaming Service. Listing 4-2 provides example code for obtaining a naming context from the examples/iiop/ejb/stateless/server/tux example. "WLS" is the bind name specified in the cnsbind command detailed in the WebLogic Tuxedo Connector Programmer's Guide.

Listing 4-2 Example Code to Obtain a Naming Context

>     .
>     .
>     .
>     // 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("");
>     .
>     .
>     .

How to Modify Outbound RMI/IIOP Applications to use the WebLogic Tuxedo Connector

Note: For an example on how to develop an outbound RMI/IIOP client, see the examples/iiop/ejb/stateless/server/wls package in your WebLogic Server distribution

The only WebLogic Tuxedo Connector programming requirement is that the EJB uses a WebLogic Tuxedo Connector-specific FederationURL to obtain the initial context used to access a remote Tuxedo CORBA object. Use the following sections to modify outbound RMI/IIOP applications to use the WebLogic Tuxedo Connector:

- How to Modify the ejb-jar.xml File to Pass a FederationURL to EJBs

- How to Modify EJBs to Use FederationURL to Access an Object

How to Modify the ejb-jar.xml File to Pass a FederationURL to EJBs

The following code from the iiop.ejb.stateless.server.wls.ejb-jar.xml file provides an example of how to configure an ejb-jar.xml file to pass a FederationURL format to the EJB at run-time.

Listing 4-3 Example ejb-jar.xml File Passing a FederationURL to an EJB

>     <?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>

To pass the FederationURL to the EJB at run-time, add an env-entry for the EJB in the ejb-jar.xml file for your application. You must assign the following env-entry sub-elements:

- Assign env-entry-name

- Assign env-entry-type

- Assign env-entry-value

Assign env-entry-name

The env-entry-name element is used to specify the name of the variable used to pass the value in the env-entry-value element to the EJB. The example code shown in Figure 4-3 specifies the env-entry-name as foreignOrb.

Assign env-entry-type

The env-entry-type element is used to specify the data type (example String, Integer, Double) of the env-entry-value element that is passed to the EJB. The example code shown in Figure 4-3 specifies that the foreignOrb variable passes String data to the EJB.

Assign env-entry-value

The env-entry-value element is used to specify the data that is passed to the EJB. The example code shown in Figure 4-3 specifies that the foreignOrb variable passes the following FederationURL format to the EJB:

corbaloc:tgiop:simpapp

How to Modify EJBs to Use FederationURL to Access an Object

This section provides information on how to use the FederationURL to obtain the InitialContext used to access a remote Tuxedo CORBA object.

The following code from the iiop.ejb.stateless.server.wls.TraderBean.java file provides an example of how to use FederationURL to get an InitialContext .

Listing 4-4 Example TraderBean.java Code to get InitialContext

>     .
>     .
>     .
>     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 environment value "+ne);
>     }
>               catch (RemoteException re) {
>                         throw new CreateException("Error creating remote ejb "+re);
>     }
>     }
>     .
>     .
>     .

Use the following steps to use FederationURL to obtain an InitialContext for a remote Tuxedo CORBA object:

1. Retrieve the FederationURL format defined in the ejb-jar.xml file.

   Example:

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

   The example code shown in Listing 4-3 specifies that the foreignOrb variable passes the following FederationURL format to the EJB:

   corbaloc:tgiop:simpapp

2. Concatenate the FederationURL format with "/NameService" to form the FederationURL.

   Example:

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

   The resulting FederationURL is:

   corbaloc:tgiop:simpapp/NameService

3. Get the InitialContext.

   Example:

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

   The result is the InitialContext of the Tuxedo CORBA object.

How to Use FederationURL Formats

This section provides information on the syntax for the following FederationURL formats:

- The CORBA URL syntax is described in the CORBA specification. For more information, see the OMG Web Site at http://www.omg.org/.

- The corbaloc:tgiop form is specific to the BEA tgiop protocol.

Using corbaloc URL Format

This section provides the syntax for corbaloc URL format:

>     <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

Examples of corbaloc:tgiop

This section provides examples on how to use 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);

Examples using -ORBInitRef

You can also use the -ORBInitRef option to orb.init and resolve_initial_reference.

Given the following -ORBInitRef definitions:

>     -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

then:

>     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");

Examples Using -ORBDefaultInitRef

You can use the -ORBDefaultInitRef and resolve_initial_reference.

Given the following -ORBDefaultInitRef definition:

>     -ORBDefaultInitRef corbaloc:tgiop:simpapp

then:

>     orb.resolve_initial_references("NameService");

Using the corbaname URL Format

You can also use the corbaname format instead of the corbaloc format.

Examples Using -ORBInitRef

Given the following -ORBInitRef definition:

>     -ORBInitRef NameService=corbaloc:tgiop:simpapp/NameService

>     then:

>     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");

How to Manage Transactions for Tuxedo CORBA Applications

Note: For more information on managing transactions in Tuxedo CORBA applications, see Overview of Transactions in BEA Tuxedo CORBA Applications at http://e-docs.bea.com/tuxedo/tux80/transact/gstrx.htm.

The WebLogic Tuxedo Connector uses the Java Transaction API (JTA) to manage transactions with Tuxedo Corba Applications. For more detailed information, see:

- Programming WebLogic JTA at ../jta/index.html

- Transaction Management at ../ejb/EJB_environment.html

Copyright © 2001 BEA Systems, Inc. All rights reserved. Required browser: Netscape 4.0 or higher, or Microsoft Internet Explorer 4.0 or higher.