Oracle Tuxedo Javaサーバーでのサービスの実装
サービスをOracle Tuxedo Javaサーバーに実装する通常の手順は次のとおりです。
1.
|
TuxedoJavaServerを継承するクラスを定義します。
|
3.
|
tpsvrinit()および tpsvrdone()メソッドを実装します。
|
4.
|
TPSVCINFOのみを引数パラメータとして使用するサービス・メソッドを次のように実装します。
|
a.
|
getTuxAppContext()メソッドを使用して TuxAppContextオブジェクトを取得します。
|
b.
|
TPSVCINFO.getServiceData()メソッドを使用して TPSVCINFOからクライアント・リクエスト・データを取得します。
|
c.
|
DataSourceを構成した場合は、DataSourceへの接続を TuxAppContext.getConnection()メソッドを使用して取得します。
|
d.
|
TuxAppContext.tpcall()を使用した他のサービスの呼出しや、データベースの操作など、ビジネス・ロジックを実行します。
|
e.
|
新しいTypedBufferを割り当て、返信データをTypedBufferに配置します。
|
f.
|
TuxAppContext.tpreturn()を呼び出して、返信データをクライアントに返します。
|
例: トランザクションなしのJavaサービスの実装
TOUPPERサービスを実装する単純な例を次に示します。3つの手順が含まれています。
import weblogic.wtc.jatmi.TypedBuffer;
import weblogic.wtc.jatmi.TypedString;
import com.oracle.tuxedo.tjatmi.*;
public class MyTuxedoJavaServer extends TuxedoJavaServer {
public MyTuxedoJavaServer()
public int tpsvrinit() throws TuxException
System.out.println("MyTuxedoJavaServer.tpsvrinit()");
System.out.println("MyTuxedoJavaServer.tpsvrdone()");
public void JAVATOUPPER(TPSVCINFO rqst) throws Exception {
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 {
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 JAVATOUPPERFORWARD()");
myAppCtxt.userlog("Received string is:" + TbString.toString());
/* Call another service "TOUPPER" which may be implemented by another Tuxedo Server */
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"?>
<TuxedoServerClass name="MyTuxedoJavaServer"></TuxedoServerClass>
TJSVRGRP LMID=simple GRPNO=2
TMJAVASVR SRVGRP= TJSVRGRP SRVID=4 CLOPT="-- -c TJSconfig.xml"
MINDISPATCHTHREADS=2 MAXDISPATCHTHREADS=2
例: トランザクションを含むJavaサービスの実装
リスト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 ()
public int tpsvrinit() throws TuxException
System.out.println("In MyTuxedoTransactionServer.tpsvrinit()");
System.out.println("In MyTuxedoTransactionServer.tpsvrdone()");
public void WRITEDB_SVCTRN_COMMIT(TPSVCINFO rqst) throws TuxException {
TypedBuffer rplyBuf = null;
String strType = "STRING";
Connection connDB = null;
int trnLvl, trnStrtInSVC;
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");
trnLvl = myAppCtxt.tpgetlev();
myAppCtxt.userlog("JAVA-INFO: Start a transaction...");
trnRtn = myAppCtxt.tpbegin(trnTime, trnFlags);
myAppCtxt.userlog("JAVA-INFO: tpbegin return " + trnRtn);
connDB = myAppCtxt.getConnection();
myAppCtxt.userlog("JAVA-INFO: Get connection: (" +
connDB.toString() + ").");
stmtDB = connDB.createStatement();
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 + ")...");
myAppCtxt.userlog("JAVA-INFO: End to execute sql (" + stmtSQL + ").");
myAppCtxt.userlog("JAVA-INFO: tpcommit current transaction...");
trnRtn = myAppCtxt.tpcommit(trnFlags);
myAppCtxt.userlog("JAVA-INFO: tpcommit return " + trnRtn);
} catch (TuxATMIRMException e) {
String errMsg = "ERROR: TuxATMIRMException: (" + e.getMessage() + ").";
myAppCtxt.userlog("JAVA-ERROR: " + errMsg);
} catch (TuxATMITPException e) {
String errMsg = "ERROR: TuxATMITPException: (" + e.getMessage() + ").";
myAppCtxt.userlog("JAVA-ERROR: " + errMsg);
} catch (SQLException e) {
String errMsg = "ERROR: SQLException: (" + e.getMessage() + ").";
myAppCtxt.userlog("JAVA-ERROR: " + errMsg);
String errMsg = "ERROR: Exception: (" + e.getMessage() + ").";
myAppCtxt.userlog("JAVA-ERROR: " + errMsg);
String errMsg = "ERROR: Throwable: (" + e.getMessage() + ").";
myAppCtxt.userlog("JAVA-ERROR: " + errMsg);
} catch (SQLException e) {}
myAppCtxt.tpreturn(rc, 0, rplyBuf, 0);
<?xml version="1.0" encoding="UTF-8"?>
<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>
<DataSource name="oracle">
<DriverClass>oracle.jdbc.xa.client.OracleXADataSource</DriverClass>
<ConnectionUrl>jdbc:oracle:thin:@//10.182.54.144:1521/javaorcl</ConnectionUrl>
<TuxedoServerClass name=" MyTuxedoTransactionServer">
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
TMJAVASVR SRVGRP=ORASVRGRP SRVID=3
CLOPT="-- -c TJSconfig.xml"
MINDISPATCHTHREADS=2 MAXDISPATCHTHREADS=4