•
Note: These steps can be done independent of application development, but must be completed before running the client application. For more information, see the Oracle Tuxedo JCA Adapter Users Guide.Different application servers may use different implementations to provide this information to the Oracle JCA Adapter. For example, Oracle WebLogic server uses the weblogic-ra.xml file (using the <jndi-name> XML tag) to provide this information as shown in Listing 1.IBM WebSphere configures this information through the administration console using the "JNDI name" field of the "J2C Connection Factory" page.Listing 1 Oracle WebLogic Server Connector<weblogic-connector
xmlns=http://www.bea.com/ns/weblogic/90>
<jndi-name>eis/TuxedoConnector</jndi-name>
...
<outbound-resource-adapter>
<connection-definition-group>
<connection-factory-interface>javax.resource.cci.ConnectionFactory</connection-factory-interface>
<connection-instance>
<jndi-name>eis/TuxedoConnectionFactory</jndi-name>
</connection-instance>
</connection-definition-group>
<outbound-resource-adapter>
</weblogic-connector>Listing 2 shows a Connection Factory lookup and Connection instance code example.The DMConfigChecker utility is used to encrypt configuration file passwords. It checks the Oracle Tuxedo JCA Adapter configuration file syntax and replaces all the unencrypted password elements with the encrypted password. If necessary, this utility can also generate a key file which is used to encrypt/decrypt the passwords.The code examples in this section perform service calls to an Oracle Tuxedo service. The service name is "TOUPPER" and requires configuration. For more information, see Configuration File Examples. The "TOUPPER" service uses a STRING Typed Buffer for input and output.To create a new interaction instance, the client application must place a call to the Connection. The interaction between client applications (javax.resource.cci.Interaction) and Oracle Tuxedo services must be customized using the interaction specification (javax.resource.cci.InteractionSpec) as shown in Listing 3.Interaction ix;
TuxedoInteractionSpec ixspec;
...
ix = c.reateInteraction()
ixspec = new TuxedoInteractionSpec();The input/output buffer type must access the Oracle Tuxedo service code or query the Oracle Tuxedo Metadata Repository. For more information, see the Oracle Tuxedo Metadata Repository documentation.Listing 4 shows a client application synchronously invoking the "TOUPPER" service.Listing 5 shows the "TOUPPER" service using a STRING buffer type for input and output.Listing 6 shows the actual "TOUPPER" service request, resource release, and reply data retrieval.Listing 7 shows a CCI client application program example.Listing 7 CCI Client Application Program Exampleimport javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.ejb.CreateException;
import javax.resource.cci.ConnectionFactory;
import javax.resource.cci.Connection;
import javax.resource.cci.Interaction;
import javax.resource.cci.Interactionspec;
import javax.resource.ResourceException;
import weblogic.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TPReplyException;
import com.oracle.tuxedo.adapter.TuxedoReplyException;
import com.oracle.tuxedo.adapter.cci.TuxedoStringRecord;
import com.oracle.tuxedo.adapter.cci.TuxedoInteractionSpec;
...
public String Toupper(String string_to_convert) throws TPException, TuxedoReplyException
{
Context ctx;
ConnectionFactory cf;
Connection c;
Interaction ix;
TuxedoStringRecord inRec;
TuxedoStringRecord outRec;
TuxedoInteractionSpec ixspec;
try {
ctx = new InitialContext();
cf = ctx.lookup("eis/TuxedoConnectionFactory");
c = cf.getConnection();
ix = c.createInteraction();
ixspec = new TuxedoInteractionSpec();
ixspec.setFunctionName("TOUPPER");
ixspec.setInteractionVerb(InteractionSpec.SYNC_SEND_RECEIVE);
inRec = new TuxedoStringRecord();
outRec = new TuxdeoStringRecord();
inRec.setRecordName("MyInputData");
outRec.setRecordMane("MyOutputData");
outRec.setString(string_to_convert);
ix.execute(ixspec, inRec, outRec);
ix.close();
c.close();
String returned_data = outRec.getString();
return returned_data;
}
catch (NamingException ne) {
throw new TPException(TPException.TPESYSTEM,
"Could not get TuxedoConnectionFactory");}
catch (ResourceException re) {
throw new TPException(TPException.TPESYSTEM,
"ResourceException occurred, reason: " + re);
}
}The Oracle JCA Adapter supports CCI-managed transaction client applications. The type of transaction depends largely on the transaction level (XA transactions or local transactions) configured in the Oracle Tuxedo JCA Adapter deployment descriptor. For more information, see the Oracle Tuxedo JCA Adapter Users Guide.The code examples in this section perform service calls to an Oracle Tuxedo service. The service name is TOUPPER_V32 and requires configuration. For more information, see Configuration File Examples. The "TOUPPER_32" service requires a VIEW32 Typed Buffer for input and output.
Note: The equivalent of VIEW32 Typed Buffer in Tuxedo JCA Adapter is TuxedoView32Record. In the following examples VIEW32 view is called "View32". The java code is generated using the viewj32 compiler.For more information, see Managing Typed Buffers in Programming An Oracle Tuxedo ATMI Application Using C and the Oracle Tuxedo JCA Adapter Command Reference Guide for viewj and viewj32 information.Listing 8 shows a VIEW32 definition file example.Listing 8 VIEW32 Definition File ExampleThis command creates a "View32.java" Java class file (package name "tuxedo.test.simpapp") in the current working directory.Listing 9 shows how to create and start a user transaction. The transaction will timeout after 300 seconds.Listing 9 Create and Start a User TransactionTo create new interaction instance, the client application must place a call to the Connection. The interaction between client applications (javax.resource.cci.Interaction) and Oracle Tuxedo services must be customized using the interaction specification (javax.resource.cci.InteractionSpec) as shown in Listing 10.The input/output buffer type must access the Oracle Tuxedo service code or query the Oracle Tuxedo Meta Data repository. Repository. For more information, see the Oracle Tuxedo Metadata Repository documentation.Listing 11 shows a client application invoking the "TOUPPER_32" service using asynchronous interaction.Listing 12 shows the "TOUPPER_32" service using a VIEW32 Typed Buffer for input and output.Listing 13 shows the actual "TOUPPER_32" service request, resource release, and reply data retrieval.
• javax.resource.cciListing 14 shows a transaction client application program example.To develop a synchronous CCI-based Tuxedo JCA Adapter local managed transaction client program using a VIEW32 Typed Buffer, you must do the following steps:The code examples in this section perform service calls to an Oracle Tuxedo service. The service name is TOUPPER and requires configuration. For more information, see Configuration File Examples. The "TOUPPER" service requires a STRING Typed Buffer for input and output.Listing 15 shows how create a new Oracle Tuxedo JCA Adapter Local Transaction instance from the Oracle Tuxedo Connection (com.oracle.tuxedo.adapter.cci.TuxedoJCALocalTransaction).Listing 15 Create a New Local Transaction InstanceTo create new interaction instance, the client application must place a call to the Connection. The interaction between client applications (javax.resource.cci.Interaction) and Oracle Tuxedo services must be customized using the interaction specification (javax.resource.cci.InteractionSpec) as shown in Listing 16.Listing 16 Create a New Interaction and SpecificationListing 17 shows how to create and start a managed local transaction. The transaction will timeout after 15 seconds.Listing 17 Create and Start a Local TransactionThe input/output buffer type must access the Oracle Tuxedo service code or query the Oracle Tuxedo Meta Data repository. Repository. For more information, see the Oracle Tuxedo Metadata Repository documentation.Listing 18 shows the client application synchronously using the "TOUPPER" service.Listing 19 shows the "TOUPPER" service using a STRING Typed Buffer for input and output.Listing 19 TOUPPER Service Using a STRING Typed BufferListing 20 shows the actual "TOUPPER" service request, resource release, and reply data retrieval.Listing 21 shows a local transaction client application program example.The code examples in this section perform service calls to an Oracle Tuxedo service. The service name is TOUPPER and requires configuration. For more information, see Configuration File Examples. The Tuxedo TOUPPER service requires a STRING Typed Buffer for input and output.To create new interaction instance, the client application must place a call to the Connection. When you use the JATMI interaction extension (com.oracle.tuxedo.adapter.cci.TuxedoInteractionSpec), an interaction specification is not required to customize the interaction between client applications and Oracle Tuxedo services.The JATMI service invocation interface already includes these interaction specifications as shown in Listing 22.Listing 22 New JATMI Interaction InstanceThe input data must be transported using an Oracle Tuxedo Typed Buffer. Listing 23 shows the "TOUPPER" service using a STRING Typed Buffer for input and output.Listing 23 TOUPPER" Service Using a STRING Buffer TypeListing 24 shows the actual "TOUPPER" service request and data retrieval reply.Listing 25 shows how the resources are released.Listing 25 JATMI Client Application Resource ReleaseListing 26 shows a JATMI client application program example.Listing 26 JATMI Client Application Program ExampleYou can use the Oracle Tuxedo JCA Adapter to access EJB-based Tuxedo client services. In order for the Oracle Tuxedo JCA Adapter to invoke an EJB, the EJB must use the weblogic.wtc.jatmi.TuxedoService interface. This interface defines a single method called service as shown in Listing 27.Listing 27 EJB Service Single Methodpublic Reply service(TPServiceInformation svcinfo)
throws TPException, TPReplyException, RemoteException;To develop an EJB-based service application using the TuxedoService.service() interface, you must do the following steps:
• use the TuxedoService interface.The service name is TOLOWER and requires configuration. For more information, see Configuration File Examples. The EJB service uses a STRING Typed Buffer for input and output.Listing 28 shows an example of how input data is retrieved using TPServiceInformation (shown in Listing 27).Listing 29 EJB Input Data Converted to Lower CaseWhen the output data is available, it must be wrapped in an Oracle Tuxedo Typed Buffer. Listing 30 shows the how the output data is wrapped using the TypedString Typed Buffer.The output Typed Buffer is then transported back to the caller (using the TPServiceInformation object) as shown in Listing 31.The required prefix (tuxedo.services) and the EJB name (TolowerHome) are configured in the <EXPORT> <SOURCE> element of the Oracle Tuxedo JCA Adapter configuration file as shown in Listing 32.Listing 32 EJB “TOLOWER”Configuration<Export name="TOLOWER">
<RemoteName>TOLOWER</RemoteName>
<SessionName>session_1</SessionName>
<Type>EJB</Type>
<Source>tuxedo.services.TolowerHome</Source>
</Export>Listing 33 shows an EJB client application program example.Listing 33 EJB Client Application Program Examplepackage test.tuxedo.simpserv;
import javax.ejb.CreateException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import weblogic.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TypedString;
import weblogic.wtc.jatmi.Reply;
import com.oracle.tuxedo.adapter.tdom.TPServiceInformation;
...
public Reply service(TPServiceInformation mydata) throws TPException
{
TypedString data;
String lowered;
TypedString returned_data;
data = (TypedString)mydata.getServiceData();
lowered = data.toString().toLowerCase();
returned_data = new TypedString(lowered);
mydata.setReplyBuffer(return_data);
return mydata;
}
...In order for the Oracle Tuxedo JCA Adapter to invoke a POJO service, the POJO service must provide a method with same name as the exported name. This method must take two fixed arguments: TPServiceInformation and TPRequestAsyncReply.To develop an POJO-based service application using the TuxedoService.service() interface, you must do the following steps:The service name is MYTOLOWER and requires configuration. For more information, see Configuration File Examples. The POJO service requires a STRING Typed Buffer for input and output.Listing 34 shows an example of how input data is retrieved using TPServiceInformation (shown in Listing 27).Listing 35 POJO Input Data Converted into Lower CaseWhen the output data is available, it must be wrapped in an Oracle Tuxedo Typed Buffer. Listing 36 shows the how the output data is wrapped using the TypedString Typed Buffer.The output Typed Buffer is then transported back to the caller (using the TPServiceInformation object) as shown in Listing 31.In order for the Oracle Tuxedo JCA Adapter to successfully invoke a POJO service, the POJO deployment descriptor must be configured. The POJO method name must be configured in the <EXPORT> section of the Oracle Tuxedo JCA Adapter configuration file as shown in Listing 38.The <SOURCE> element contains the fully qualified class name, and the <SourceLocation> element contains the full path name to the .JAR file that contains the class. The .JAR file must be configured in the CLASSPATH.Listing 38 POJO "TOLOWER_POJO" Configuration<Export name="TOLOWER_POJO">
<RemoteName>TOLOWER_POJO</RemoteName>
<SessionName>session_1</SessionName>
<Type>POJO</Type>
<Source>com.oracle.tuxedo.test.MyTolower</Source>
<SourceLocation>c:\tuxedo\jca\test\myapp.jar</SourceLocation>
</Export>Listing 39 shows a POJO client application program example.Listing 39 POJO Client Application Program Examplepackage com.oracle.tuxedo.test;
import javax.ejb.CreateException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import weblogic.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TypedString;
import weblogic.wtc.jatmi.Reply;
import weblogic.wtc.jatmi.TPRequestAsyncReply;
import com.oracle.tuxedo.adapter.tdom.TPServiceInformation;
...
public void TOLOWER_POJO(TPServiceInformation svcinfo, TPRequestAsyncReply areply) throws TPException
{
TypedString typedstr;
String lower;
TypedString returned_data;
typedstr = (TypedString)svcinfo.getServiceData();
lower = typedstr.toString().toLowerCase();
returned_data = new TypedString(lower);
svcinfo.setReplyBuffer(return_data);
areply.success(svcinfo);
}
...The Oracle Tuxedo JCA Adapter configuration file is a formal syntax XML file. The location of this file is configured in the ra.xml file in the resource adapter configuration property. For more information, see the Oracle Tuxedo JCA Adapter Reference Guide.Listing 40 shows an example ra.xml file snippet that links the configuration file with the Oracle Tuxedo JCA Adapter.Listing 40 ra.xml File ExampleListing 41 shows an Oracle Tuxedo JCA Adapter DMCONFIG file example that accesses:Listing 41 Oracle Tuxedo JCA Adapter Configuration FileListing 42 and Listing 43 show UBBCONFIG and BDMCONFIG file snippet examples required to expose services inside an Oracle Tuxedo Application Domain and inter-domain requests.Listing 42 UBBCONFIG File Snippet ExampleListing 43 BMDCONFIG File Snippet Example