Javaを使用したOracle Tuxedoアプリケーションのプログラミング

     前  次    新規ウィンドウで目次を開く    PDFとして表示 - 新規ウィンドウ  Adobe Readerを入手 - 新規ウィンドウ
コンテンツはここから始まります

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

このトピックには次の項が含まれます:

 


通常の手順

サービスをOracle Tuxedo Javaサーバーに実装する通常の手順は次のとおりです。

  1. TuxedoJavaServerを継承するクラスを定義します。
  2. デフォルト・コンストラクタを指定します。
  3. tpsvrinit()およびtpsvrdone()メソッドを実装します。
  4. TPSVCINFOのみを引数パラメータとして使用するサービス・メソッドを次のように実装します。
    1. getTuxAppContext()メソッドを使用してTuxAppContextオブジェクトを取得します。
    2. TPSVCINFO.getServiceData()メソッドを使用してTPSVCINFOからクライアント・リクエスト・データを取得します。
    3. DataSourceを構成した場合は、DataSourceへの接続をTuxAppContext.getConnection()メソッドを使用して取得します。
    4. TuxAppContext.tpcall()を使用した他のサービスの呼出しや、データベースの操作など、ビジネス・ロジックを実行します。
    5. 新しいTypedBufferを割り当て、返信データをTypedBufferに配置します。
    6. TuxAppContext.tpreturn()を呼び出して、返信データをクライアントに返します。

 


例: トランザクションなしのJavaサービスの実装

TOUPPERサービスを実装する単純な例を次に示します。3つの手順が含まれています。

  1. Javaクラスの定義: リスト3-1
  2. Javaサーバー構成ファイルの作成: リスト3-2
  3. UBB構成ファイルの更新: リスト3-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. Javaクラスの定義: リスト3-4
  2. Javaサーバー構成ファイルの作成: リスト3-5
  3. UBB構成ファイルの更新: リスト3-6

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

  先頭に戻る       前  次