目次 前 次 PDF


Oracle Tuxedo Javaサーバーでのサービスの実装

Oracle Tuxedo Javaサーバーでのサービスの実装
このトピックには次の項が含まれます:
通常の手順
サービスをOracle Tuxedo Javaサーバーに実装する通常の手順は次のとおりです。
1.
TuxedoJavaServerを継承するクラスを定義します。
2.
デフォルト・コンストラクタを指定します。
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つの手順が含まれています。
1.
2.
3.
Javaクラスの定義
リスト3-1 Javaクラスの定義
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);
}
}
 
}
 
Javaサーバー構成ファイルの作成
リスト3-2に、MyTuxedoJavaServer.JAVATOUPPER()メソッドをTuxedoサービス名JAVATOUPPERMyTuxedoJavaServer.JAVATOUPPERFORWARD()メソッドをTuxedoサービス名JAVATOUPPERFORWARDとしてエクスポートする構成の例を示します。
リスト3-2 Javaサーバー構成ファイル
<?xml version="1.0" encoding="UTF-8"?>
<TJSconfig>
<TuxedoServerClasses>
<TuxedoServerClass name="MyTuxedoJavaServer"></TuxedoServerClass>
</TuxedoServerClasses>
</TJSconfig>
 
UBB構成ファイルの更新
リスト3-3 UBB Configファイルの構成
*GROUPS
TJSVRGRP LMID=simple GRPNO=2
*SERVERS
TMJAVASVR SRVGRP= TJSVRGRP SRVID=4 CLOPT="-- -c TJSconfig.xml"
MINDISPATCHTHREADS=2 MAXDISPATCHTHREADS=2
 
例: トランザクションを含むJavaサービスの実装
リスト3-4に、ユーザー・リクエスト文字列を表TUXJ_TRAN_TESTに挿入するWRITEDB_SVCTRN_COMMITサービスを実装する例を示します。
3つの手順が含まれています。
1.
2.
3.
Javaクラスの定義
リスト3-4 クラスの定義
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);
}
}
 
Javaサーバー構成ファイルの作成
リスト3-5 Javaサーバー構成ファイル
<?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>
 
UBB構成ファイルの更新
リスト3-6 UBB Confファイルの構成
*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
 
関連項目
TMJAVASVR(5)
Oracle Tuxedo Javaサーバーの管理
Oracle Tuxedo Javaサーバーの構成
付録: Javaサーバー構成ファイルのスキーマ
Javaを使用したOracle Tuxedoアプリケーションのプログラミング

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved