This chapter offers an example of how to convert a WLEC application to use Oracle WebLogic Tuxedo Connector. This example provides information on the steps required to convert the WebLogic Server 6.1 examples\wlec\ejb\simpapp
example to work using the Oracle WebLogic Tuxedo Connector.
This chapter includes the following sections:
Review Prerequisites, before proceeding.
The following sections provide information on how to modify the Tuxedo configuration files to use with Oracle WebLogic Tuxedo Connector.
You should run the Tuxedo CORBA simpapp
example to verify your Tuxedo environment and prepare to run the WLEC simpapp
application.
Use the following steps to run the Tuxedo example located at $TUXDIR/samples/corba/simpapp
:
Create a working copy of the Tuxedo CORBA simpapp
example. Copy the Tuxedo CORBA simpapp
example from your Tuxedo installation and place it in your working simpapp
directory.
Change directories to your working simpapp
directory.
Build and run the example.
Set your Tuxedo environment. Windows users set %TUXDIR%
in your shell environment. Unix users need to set the Tuxedo environment by running $TUXDIR/tux.env
.
Make sure the C++ compiler is in your PATH
.
Set the JAVA_HOME
environment variable to the location of your Tuxedo Java JDK.
Set the environment by running the runme
script. This will create the client stubs that provide the programming interface for CORBA object operations. A results
directory is created in your working directory that contains the files used to configure the Tuxedo environment.
Run the Java client.
java -DTOBJADDR=%TOBJADDR% -classpath %CLASSPATH% SimpleClient
Shutdown the Tuxedo server.
tmshutdown -y
In your working Tuxedo simpapp
directory, use the following steps to modify your UBB configuration:
Rename the results/ubb
file in your working directory as results/ubbdomain
.
Edit the ubbdomain
file using a text editor, such as vi or WordPad.
Add Tuxedo gateway servers to the *SERVERS
section.
Example: Add the following servers.
DMADM SRVGRP=SYS_GRP SRVID=7 GWADM SRVGRP=SYS_GRP SRVID=8 GWTDOMAIN SRVGRP=SYS_GRP SRVID=9
Save the ubbdomain
file.
Example 3-1 is an example of a modified ubbdomain
file. Changed sections are marked in bold.
*RESOURCES IPCKEY 55432 DOMAINID simpapp MASTER SITE1 MODEL SHM LDBAL N *MACHINES "balto" LMID = SITE1 APPDIR = "/tux_apps/corba/simpapp" TUXCONFIG = "/tux_apps/corba/simpapp/results/tuxconfig" TUXDIR = "/my_machine/tux/tuxedo8.1" MAXWSCLIENTS = 10 *GROUPS SYS_GRP LMID = SITE1 GRPNO = 1 APP_GRP LMID = SITE1 GRPNO = 2 *SERVERS DEFAULT: RESTART = Y MAXGEN = 5 TMSYSEVT SRVGRP = SYS_GRP SRVID = 1 TMFFNAME SRVGRP = SYS_GRP SRVID = 2 CLOPT = "-A -- -N -M" TMFFNAME SRVGRP = SYS_GRP SRVID = 3 CLOPT = "-A -- -N" TMFFNAME SRVGRP = SYS_GRP SRVID = 4 CLOPT = "-A -- -F" simple_server SRVGRP = APP_GRP SRVID = 1 RESTART = N # The ISL handler is not needed for WTC. # If you do not need it for other WLEC applications, # it can be removed. ISL SRVGRP = SYS_GRP SRVID = 5 CLOPT = "-A -- -n //mymachine:2468 -d /dev/tcp" DMADM SRVGRP = SYS_GRP SRVID = 7 GWADM SRVGRP = SYS_GRP SRVID = 8 GWTDOMAIN SRVGRP = SYS_GRP SRVID = 9 *SERVICES
In your working Tuxedo simpapp
directory, use the following steps to create a domain configuration:
Create a domain configuration file using a text editor, such as vi or NotePad. The simplest method is to cut and paste the DMCONFIG
code example into your editor.
Replace all <bold bracketed>
items in Example 3-2 with information about your environment.
*DM_RESOURCES VERSION=U22 *DM_LOCAL_DOMAINS TUXDOM GWGRP=SYS_GRP TYPE=TDOMAIN DOMAINID="TUXDOM" BLOCKTIME=20 MAXDATALEN=56 MAXRDOM=89 DMTLOGDEV="<Path to domain TLOG device>" DMTLOGNAME="DMTLOG_TUXDOM" *DM_REMOTE_DOMAINS examples TYPE=TDOMAIN DOMAINID="examples" *DM_TDOMAIN TUXDOM NWADDR="<network address of Tuxedo domain>" examples NWADDR="<network address of WTC domain>" *DM_REMOTE_SERVICES
Save the file as DMCONFIG
in your working simpapp/results
directory.
Use the following steps to validate your Tuxedo configuration:
In a new shell, change directories to your working simpapp/results
directory.
Set the environment using the setenv
script for your platform.
Load the ubbdomain
file:
tmloadcf -y ubbdomain
Load the DMCONFIG
file:
set BDMCONFIG=<path_to_your_working_simpapp_example>/simpapp/results/bdmconfig dmloadcf -y dmconfig
Boot the Tuxedo domain
tmboot -y
Verify the Tuxedo environment.
java -DTOBJADDR=%TOBJADDR% -classpath %CLASSPATH% SimpleClient
Shutdown the Tuxedo server.
tmshutdown -y
Use a text editor such as vi or Notepad to remove connection pool descriptors and update the trans-attribute. Example 3-3 is a code example showing how to remove references to the IIOP connection pool descriptors in the WLEC simpapp
example ejb-jar.xml
. This example
Removes the env-entry
attribute.
Sets the trans-attribute
in the container-transaction
to Supports
. As the example does not have a transaction, the container-transaction
can not be Required
.
Example 3-3 Example XML Configuration File for a CORBA Server Application
. . . <ejb-jar> <enterprise-beans> <session> <ejb-name>ejb</ejb-name> <home>examples.wlec.ejb.simpapp.ConverterHome</home> <remote>examples.wlec.ejb.simpapp.Converter</remote> <ejb-class>examples.wlec.ejb.simpapp.ConverterBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> <!-- Remove or comment out the following statements <env-entry> <env-entry-name>IIOPPoolName</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>simplepool</env-entry-value> </env-entry> --> </session> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>ejb</ejb-name> <method-intf>Remote</method-intf> <method-name>*</method-name> </method> <trans-attribute>Supports</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar>
A build.xml
file is presented below to simplify compiling and deploying your migrated application in the Weblogic environment. Replace the contents of the build.xml
file with the code shown in Example 3-4.
Example 3-4 Updated build.xml file
<project name="wlec-ejb-simpapp" default="all" basedir="."> <!-- set global properties for this build --> <property environment="env"/> <property file="../../../../examples.properties"/> <property name="build.compiler" value="${compiler}"/> <property name="source" value="."/> <property name="build" value="${source}/build"/> <property name="dist" value="${source}/dist"/> <property name="ejb_classes" value="Converter.java, ConverterHome.java, ConverterResult.java, ProcessingErrorException.java, ConverterBean.java"/> <property name="ejb_jar" value="wlec_simpapp_corba.jar"/> <property name="client_classes" value="Converter.java, ConverterHome.java, ConverterResult.java, ProcessingErrorException.java, Client.java"/> <target name="all" depends="clean, init, compile_idl, compile_ejb, jar_ejb, appc, compile_client"/> <target name="init"> <!-- Create the time stamp --> <tstamp/> <!-- Create the build directory structure used by compile and copy the deployment descriptors into it--> <mkdir dir="${build}"/> <mkdir dir="${build}/META-INF"/> <mkdir dir="${dist}"/> <copy todir="${build}/META-INF"> <fileset dir="${source}"> <include name="*.xml"/> <exclude name="build.xml"/> </fileset> </copy> </target> <!-- Compile IDL stub classes into the build directory (jar preparation) --> <target name="compile_idl"> <exec executable="idlj" dir="."> <arg line="-td build -pkgPrefix Simple simple -pkgPrefix SimpleFactory simple simple.idl" /> </exec> <javac srcdir="${build}" destdir="${build}" classpath="${CLASSPATH};${build}"/> <delete> <fileset dir="${build}"> <include name="*.java"/> </fileset> </delete> </target> <!-- Compile ejb classes into the build directory (jar preparation) --> <target name="compile_ejb"> <javac srcdir="${source}" destdir="${build}" includes="${ejb_classes}" classpath="${CLASSPATH};${build}"/> </target> <!-- Make a standard ejb jar file, including XML deployment descriptors --> <target name="jar_ejb" depends="compile_ejb"> <jar jarfile="${dist}/std_${ejb_jar}" basedir="${build}"> </jar> </target> <!-- Run appc to create the deployable jar file --> <target name="appc" depends="jar_ejb"> <echo message="Generating container classes in ${apps.dir}/${ejb_jar}"/> <wlappc debug="${debug}" iiop="true" source="${dist}/std_${ejb_jar}" output="${apps.dir}/${ejb_jar}" /> </target> <!-- Compile EJB interfaces & client app into the clientclasses directory --> <target name="compile_client"> <javac srcdir="${source}" destdir="${client.classes.dir}" includes="${client_classes}" /> </target> <target name="run"> <java classname="examples.wlec.ejb.simpapp.Client"> </java> </target> <target name="clean"> <delete dir="${build}"/> <delete dir="${dist}"/> </target> </project>
Example 3-5 provides a code example showing how to modify the wlec/ejb/simpapp
example ConverterBean.java file to interoperate with Tuxedo using Oracle WebLogic Tuxedo Connector.
All changes are highlighted in bold and look like this: new code
.
Statements that are no longer needed are commented out using //
and look like this: // old code
.
Example 3-5 Modified ConverterBean.java file
package examples.wlec.ejb.simpapp; import javax.ejb.*; import java.io.Serializable; import java.util.*; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import org.omg.CORBA.*; import com.beasys.Tobj.*; import com.beasys.*; /*These come from WebLogic Enterprise Simpapp sample */ //import SimpleFactory; //import SimpleFactoryHelper; //import Simple; import simple.SimpleFactory; import simple.SimpleFactoryHelper; import simple.Simple; /** * <font face="Courier New" size=-1>ConverterBean</font> is a stateless * SessionBean. * This bean illustrates: * <ul> * <li> Accessing ISL/ISH process and then a WebLogic Enterprise server * <li> No persistence of state between calls to the SessionBean * <li> Application-defined exceptions * </ul> */ public class ConverterBean implements SessionBean { static SimpleFactory simple_factory_ref; // ----------------------------------------------------------------- // private variables private SessionContext ctx; private Context rootCtx; private ORB orb; // ----------------------------------------------------------------- // SessionBean implementation /** * This method is required by the EJB Specification, * but is not used by this example. * */ public void ejbActivate() {} /** * This method is required by the EJB Specification, * but is not used by this example. * */ public void ejbRemove() {} /** * This method is required by the EJB Specification, * but is not used by this example. * */ public void ejbPassivate() {} /** * Sets the session context. * * @param ctx SessionContext context for session */ public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } // Interface exposed to EJBObject /** * This method corresponds to the <font face="Courier New" size=-1>create</font> * method in the home interface <font *face="CourierNew"size=-1>ConverterHome.java</font>. * The parameter sets of these two methods are identical. When the client calls the * <font face="Courier New" size=-1>ConverterHome.create</font> method, the * container allocates an instance of the EJBean and calls the * <font face="Courier New" size=-1>ejbCreate</font> method. * * @exception CreateException * if there is an error while initializing the IIOP pool * @see examples.wlec.ejb.simpapp.Converter */ public void ejbCreate () throws CreateException { try { // try { // Properties p = new Properties(); // p.put(Context.INITIAL_CONTEXT_FACTORY, // "weblogic.jndi.WLInitialContextFactory"); // InitialContext ic = new InitialContext(p); // rootCtx = (Context)ic.lookup("java:comp/env"); // } //catch (NamingException ne) { // throw new CreateException("Could not lookup context"); // } // Initialize the ORB. String args[] = null; Properties Prop; Prop = new Properties(); Prop.put("org.omg.CORBA.ORBClass", "weblogic.wtc.corba.ORB"); orb = (ORB)new InitialContext().lookup("java:comp/ORB"); initIIOPpool(); } catch (Exception e) { throw new CreateException("ejbCreate called: " + e); } } /** * Converts the string to uppercase. * * @param mixed string input data * @return ConverterResult conversion result * @exception examples.wlec.ejb.simpapp.ProcessingErrorException * if there is an error while converting the string */ public ConverterResult toUpper(String mixed) throws ProcessingErrorException { return convert("UPPER", mixed); } /** * Converts the string to lowercase. * * @param mixed string input data * @return ConverterResult conversion result * @exception examples.wlec.ejb.simpapp.ProcessingErrorException * if there is an error while converting the string */ public ConverterResult toLower(String mixed) throws ProcessingErrorException { return convert("LOWER", mixed); } protected ConverterResult convert (String changeCase, String mixed) throws ProcessingErrorException { String result; try { // 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) { throw new ProcessingErrorException("Converter error: Corba system exception: " + e); } catch (Exception e) { throw new ProcessingErrorException("Converter error: " + e); } return new ConverterResult(result); } // Private methods /** * Returns the WebLogic Enterprise Connectivity pool name. * * @return String IIOP pool name */ // private String getIIOPPoolName() throws ProcessingErrorException { // try { // return (String) rootCtx.lookup("IIOPPoolName"); //} // catch (NamingException ne) { // throw new ProcessingErrorException ("IIOPPoolName not found in context"); //} //} /** * Initializes an IIOP connection pool. */ private void initIIOPpool() throws Exception { try { // Create the bootstrap object, // Tobj_Bootstrap bootstrap = // BootstrapFactory.getClientContext(getIIOPPoolName()); // Use the bootstrap object to find the factory finder. // org.omg.CORBA.Object fact_finder_oref = // bootstrap.resolve_initial_references("FactoryFinder") ; 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()); // Narrow the simple factory. simple_factory_ref = SimpleFactoryHelper.narrow(simple_fact_oref); } catch (org.omg.CosLifeCycle.NoFactory e) { throw new Exception("Can't find the simple factory: " +e); } catch (CannotProceed e) { throw new Exception("FactoryFinder internal error: " +e); } catch (RegistrarNotAvailable e) { throw new Exception("FactoryFinder Registrar not available: " +e); } //catch (InvalidName e) { // throw new Exception("Invalid name from resolve_initial_reference(): " +e); //} // catch (org.omg.CORBA.BAD_PARAM e) { // throw new Exception("Invalid TOBJADDR=//host:port property specified: " +e); // } catch (org.omg.CORBA.UserException e) { throw new Exception("Unexpected CORBA user exception: " +e); } catch (org.omg.CORBA.SystemException e) { throw new Exception("CORBA system exception: " +e); } } }
The following sections describe the steps for configuring Oracle WebLogic Tuxedo Connector to connect WebLogic Server and the modified WLEC application:
To create and configure a WTC service using the WebLogic Server Administration Console:
In the Administration Console, expand Interoperability and select WTC Servers in the navigation tree.
On the WTC Servers page, click New.
On the Create a New WTC Server page, enter My_WLEC_App to identify this configuration in the name field.
Click OK.
Your new WTC Service appears in the WTC Servers list.
Note:
When configuring the Network Address for a local access point, the port number used should be different from any port numbers assigned to other processes. Example: Setting the Network Address to //mymachine:7001
is not valid if the WebLogic Server listening port is assigned to //mymachine:7001
.
To configure a local Tuxedo access point:
In the Administration Console, expand Interoperability and select WTC Servers.
On the WTC Servers page, click the name of a WTC Service to access the settings page.
Click the Local APs tab.
Enter the following values for the following fields on the WTC Local Access Points page:
In Access Point, enter My_Local_WLS_Dom.
In Access Point Id, enter examples
.
In Network Address, enter the network address and port of the WebLogic Server environment that will host this local domain. For example, //my_WLS_machine:5678
.
Click OK.
To configure a remote Tuxedo access point:
In the Administration Console, expand Interoperability and select WTC Servers.
On the WTC Servers page, click the name of a WTC Service.
Click the Remote APs tab.
Enter the following values for the following fields on the WTC Remote Access Points page:
In Access Point, enter My_WLEC_Dom.
In Access Point Id, enter TUXDOM.
In Local Access Point, enter My_Local_WLS_Dom.
In Network Address, enter the network address and port of the Tuxedo environment that will host this remote domain. For example, //my_TUX_machine:5678
.
Click OK.
To configure an imported service:
In the Administration Console, expand Interoperability and select WTC Servers.
On the WTC Servers page, click the name of a WTC Service.
Click the Imported tab.
Enter the following values for the following fields on the WTC Imported Services page:
In Resource Name, enter //simpapp
.
In Local Access Point, enter My_Local_WLS_Dom.
In Remote Access Point List, enter My_WLEC_Dom.
In Remote Name, enter //
domain_id
where domain_id
is DOMAINID
specified in the Tuxedo UBBCONFIG
file. The maximum length of this unique identifier for CORBA domains is 15 characters and includes the //
. For example, //simpappff
.
Click OK.
To run the simpapp
example, complete the following steps:
Open a new shell and change directories to your working Tuxedo CORBA simpapp
example.
Set environment variables.
For Windows NT and 2000 systems, run the following command:
results\setenv.cmd
For UNIX systems, run the following command:
results\setenv.sh
Boot the Tuxedo domain:
tmboot -y
Open a new shell and change directories to your WebLogic Server WLEC simpapp
example.
Set environment variables. Update the following parameters:
Note:
On Windows NT or 2000 systems, modify and run the setExamplesEnv.cmd script
. On Unix systems, copy the ./config/examples/setExamplesEnv.sh script
to your WLEC simpapp
directory, then modify and run the setExamplesEnv.sh script.
Copy the simple.idl
file from the Tuxedo CORBA simpapp
example to your WebLogic Server WLEC simpapp
example.
Build the wlec_simpapp_corba.jar
file using the following command:
ant
Use the WLS console to target My_WLEC_App to the server.
Run the client by entering the following command:
ant run
The Java application generates the following output:
Beginning simpapp.Client... Start of Conversion for: It Works Converting to lower case: It Works ...Converted: it works Converting to upper case: It Works ...Converted: IT WORKS Removing Converter End simpapp.Client...
If you have a problem running the example, use the WTC tracing feature. See "Troubleshooting the WebLogic Tuxedo Connector" in WebLogic Tuxedo Connector Administration Guide for Oracle WebLogic Server.