サービスをOracle Tuxedo Javaサーバーに実装する通常の手順は次のとおりです。
TuxedoJavaServer
を継承するクラスを定義します。 tpsvrinit()
およびtpsvrdone()
メソッドを実装します。TPSVCINFO
のみを引数パラメータとして使用するサービス・メソッドを次のように実装します。getTuxAppContext()
メソッドを使用してTuxAppContext
オブジェクトを取得します。TPSVCINFO.getServiceData()
メソッドを使用してTPSVCINFO
からクライアント・リクエスト・データを取得します。TuxAppContext.getConnection()
メソッドを使用して取得します。TuxAppContext.tpcall()
を使用した他のサービスの呼出しや、データベースの操作など、ビジネス・ロジックを実行します。TuxAppContext.tpreturn()
を呼び出して、返信データをクライアントに返します。
TOUPPER
サービスを実装する単純な例を次に示します。3つの手順が含まれています。
import weblogic.wtc.jatmi.TypedBuffer;
import weblogic.wtc.jatmi.TypedString;
import com.oracle.tuxedo.tjatmi.*;
public class MyTuxedoJavaServer extends TuxedoJavaServer {
public MyTuxedoJavaServer()
{
return;
}
public int tpsvrinit() throws TuxException
{
System.out.println("MyTuxedoJavaServer.tpsvrinit()");
return 0;
}
public void tpsvrdone()
{
System.out.println("MyTuxedoJavaServer.tpsvrdone()");
return;
}
public void JAVATOUPPER(TPSVCINFO rqst) throws Exception {
TypedBuffer svcData;
TuxAppContext myAppCtxt = null;
TuxATMIReply myTuxReply = null;
TypedBuffer replyTb = null;
/* Get TuxAppContext first */
myAppCtxt = getTuxAppContext();
svcData = rqst.getServiceData();
TypedString TbString = (TypedString)svcData;
myAppCtxt.userlog("Handling in JAVATOUPPER()");
myAppCtxt.userlog("Received string is:" + TbString.toString());
String newStr = TbString.toString();
newStr = newStr.toUpperCase();
TypedString replyTbString = new TypedString(newStr);
/* Return new string to client */
myAppCtxt.tpreturn(TPSUCCESS, 0, replyTbString, 0);
}
public void JAVATOUPPERFORWARD(TPSVCINFO rqst) throws Exception {
TypedBuffer svcData;
TuxAppContext myAppCtxt = null;
TuxATMIReply myTuxReply = null;
TypedBuffer replyTb = null;
long flags = TPSIGRSTRT;
/* Get TuxAppContext first */
myAppCtxt = getTuxAppContext();
svcData = rqst.getServiceData();
TypedString TbString = (TypedString)svcData;
myAppCtxt.userlog("Handling in JAVATOUPPERFORWARD()");
myAppCtxt.userlog("Received string is:" + TbString.toString());
/* Call another service "TOUPPER" which may be implemented by another Tuxedo Server */
try {
myTuxReply = myAppCtxt.tpcall("TOUPPER", svcData, flags);
/* If success, get reply buffer */
replyTb = myTuxReply.getReplyBuffer();
TypedString replyTbStr = (TypedString)replyTb;
myAppCtxt.userlog("Replied string from TOUPPER:" + replyTbStr.toString());
/* Return the replied buffer to client */
myAppCtxt.tpreturn(TPSUCCESS, 0, replyTb, 0);
} catch (TuxATMITPReplyException tre) {
myAppCtxt.userlog("TuxATMITPReplyException:" + tre);
myAppCtxt.tpreturn(TPFAIL, 0, null, 0);
} catch (TuxATMITPException te) {
myAppCtxt.userlog("TuxATMITPException:" + te);
myAppCtxt.tpreturn(TPFAIL, 0, null, 0);
}
}
}
リスト3-2に、MyTuxedoJavaServer.JAVATOUPPER()
メソッドをTuxedoサービス名JAVATOUPPER
、MyTuxedoJavaServer.JAVATOUPPERFORWARD()
メソッドをTuxedoサービス名JAVATOUPPERFORWARD
としてエクスポートする構成の例を示します。
<?xml version="1.0" encoding="UTF-8"?>
<TJSconfig>
<TuxedoServerClasses>
<TuxedoServerClass name="MyTuxedoJavaServer"></TuxedoServerClass>
</TuxedoServerClasses>
</TJSconfig>
*GROUPS
TJSVRGRP LMID=simple GRPNO=2
*SERVERS
TMJAVASVR SRVGRP= TJSVRGRP SRVID=4 CLOPT="-- -c TJSconfig.xml"
MINDISPATCHTHREADS=2 MAXDISPATCHTHREADS=2
リスト3-4に、ユーザー・リクエスト文字列を表TUXJ_TRAN_TEST
に挿入するWRITEDB_SVCTRN_COMMIT
サービスを実装する例を示します。
import weblogic.wtc.jatmi.TypedBuffer;
import weblogic.wtc.jatmi.TypedString;
import com.oracle.tuxedo.tjatmi.*;
import java.sql.SQLException;
/* MyTuxedoTransactionServer is user defined class */
public class MyTuxedoTransactionServer extends TuxedoJavaServer{
public MyTuxedoTransactionServer ()
{
return;
}
public int tpsvrinit() throws TuxException
{
System.out.println("In MyTuxedoTransactionServer.tpsvrinit()");
return 0;
}
public void tpsvrdone()
{
System.out.println("In MyTuxedoTransactionServer.tpsvrdone()");
return;
}
public void WRITEDB_SVCTRN_COMMIT(TPSVCINFO rqst) throws TuxException {
TuxAppContext myAppCtxt;
TypedBuffer rplyBuf = null;
String strType = "STRING";
String ulogMsg;
TypedString rqstMsg;
Connection connDB = null;
Statement stmtDB = null;
String stmtSQL;
int trnLvl, trnStrtInSVC;
int trnRtn;
int rc = TPSUCCESS;
rqstMsg = (TypedString)rqst.getServiceData();
myAppCtxt = getTuxAppContext();
myAppCtxt.userlog("JAVA-INFO: Request Message Is \"" + rqstMsg.toString() + "\"");
rplyBuf = new TypedString("This Is a Simple Transaction Test from Tuxedo Java Service");
long trnFlags = 0;
try {
trnStrtInSVC = 0;
trnLvl = myAppCtxt.tpgetlev();
if (0 == trnLvl) {
long trnTime = 6000;
myAppCtxt.userlog("JAVA-INFO: Start a transaction...");
trnRtn = myAppCtxt.tpbegin(trnTime, trnFlags);
myAppCtxt.userlog("JAVA-INFO: tpbegin return " + trnRtn);
trnStrtInSVC = 1;
}
connDB = myAppCtxt.getConnection();
if (null != connDB) {
myAppCtxt.userlog("JAVA-INFO: Get connection: (" +
connDB.toString() + ").");
}
stmtDB = connDB.createStatement();
if (null != stmtDB) {
myAppCtxt.userlog("JAVA-INFO: Create statement: (" +
stmtDB.toString() + ").");
}
stmtSQL = "INSERT INTO TUXJ_TRAN_TEST VALUES ('" +
rqstMsg.toString() + "')";
myAppCtxt.userlog("JAVA-INFO: Start to execute sql (" + stmtSQL + ")...");
stmtDB.execute(stmtSQL);
myAppCtxt.userlog("JAVA-INFO: End to execute sql (" + stmtSQL + ").");
if (1 == trnStrtInSVC) {
myAppCtxt.userlog("JAVA-INFO: tpcommit current transaction...");
trnRtn = myAppCtxt.tpcommit(trnFlags);
myAppCtxt.userlog("JAVA-INFO: tpcommit return " + trnRtn);
trnStrtInSVC = 0;
if (-1 == trnRtn ) {
rc = TPFAIL;
}
}
} catch (TuxATMIRMException e) {
String errMsg = "ERROR: TuxATMIRMException: (" + e.getMessage() + ").";
myAppCtxt.userlog("JAVA-ERROR: " + errMsg);
rc = TPFAIL;
} catch (TuxATMITPException e) {
String errMsg = "ERROR: TuxATMITPException: (" + e.getMessage() + ").";
myAppCtxt.userlog("JAVA-ERROR: " + errMsg);
rc = TPFAIL;
} catch (SQLException e) {
String errMsg = "ERROR: SQLException: (" + e.getMessage() + ").";
myAppCtxt.userlog("JAVA-ERROR: " + errMsg);
rc = TPFAIL;
} catch (Exception e) {
String errMsg = "ERROR: Exception: (" + e.getMessage() + ").";
myAppCtxt.userlog("JAVA-ERROR: " + errMsg);
rc = TPFAIL;
} catch (Throwable e) {
String errMsg = "ERROR: Throwable: (" + e.getMessage() + ").";
myAppCtxt.userlog("JAVA-ERROR: " + errMsg);
rc = TPFAIL;
} finally {
if (null != stmtDB) {
try {
stmtDB.close();
} catch (SQLException e) {}
}
myAppCtxt.tpreturn(rc, 0, rplyBuf, 0);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<TJSconfig>
<ClassPaths>
<ClassPath>/home/oracle/app/oracle/product/11.2.0/dbhome_2/ucp/lib/ucp.jar</ClassPath>
<ClassPath>/home/oracle/app/oracle/product/11.2.0/dbhome_2/jdbc/lib/ojdbc6.jar</ClassPath>
</ClassPaths>
<DataSources>
<DataSource name="oracle">
<DriverClass>oracle.jdbc.xa.client.OracleXADataSource</DriverClass>
<JdbcDriverParams>
<ConnectionUrl>jdbc:oracle:thin:@//10.182.54.144:1521/javaorcl</ConnectionUrl>
</JdbcDriverParams>
</DataSource>
</DataSources>
<TuxedoServerClasses>
<TuxedoServerClass name=" MyTuxedoTransactionServer">
</TuxedoServerClass>
</TuxedoServerClasses>
</TJSconfig>
*GROUPS
ORASVRGRP LMID=simple GRPNO=1
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/triger+SesTm=120+MaxCur=5+LogDir=.+SqlNet=javaorcl"
TMSNAME=TMSORA TMSCOUNT=2
*SERVERS
TMJAVASVR SRVGRP=ORASVRGRP SRVID=3
CLOPT="-- -c TJSconfig.xml"
MINDISPATCHTHREADS=2 MAXDISPATCHTHREADS=4