bankapp
とは、Oracle Tuxedoソフトウェアに備わっているサンプルATMI銀行業務アプリケーションです。アプリケーションは、口座の開設および解約、口座の残高照会、口座への預金または口座からの引出し、ある口座から別の口座への振替えといった銀行教務を実行します。
このチュートリアルでは、bankapp
アプリケーションを開発して実行するための手順を順に示します。このチュートリアルでbankapp
の「開発」を経験すると、独自のアプリケーションを開発できるようになります。
bankapp
チュートリアルは、次の3つの項から構成されています。
注: | ここで説明する内容は、アプリケーションの開発、管理、プログラミングに経験のあるUNIXおよびWindows 2003システムのユーザーを対象としています。また、Oracle Tuxedoソフトウェアについて理解していることを前提としています。 |
このサンプル・アプリケーションの手順は、UNIXまたはWindows 2003環境で動作するシェル・スクリプトRUNME.sh
とRUNME.cmd
によって自動化されています。対応するreadme
ファイルに、これらのファイルの実行方法が説明されています。これらのファイルに目をとおし実行の手順を十分に理解した上で、ここで説明する内容に従って操作をすれば、分散アプリケーションの設定と管理をよりスムーズに行うことができます。
bankapp
サンプル・アプリケーションでは、ソフトウェアに同梱のデモ版リレーショナル・データベースが使用されています。サンプル・アプリケーションに用意されたデモ用の各種コマンドとSQLコードを使用して、データベースにアクセスします。
ここでは、bankapp
アプリケーションを構成するファイル、クライアントおよびサービスについて説明します。それぞれの詳細は、次のアクティビティのいずれかをクリックしてください。
bankapp
アプリケーションを構成するファイルは、bankapp
ディレクトリに置かれています。このディレクトリは、次の図のように構成されています。
bankapp
ディレクトリには、次のファイルが置かれています。
audit
)AUDIT
)auditcon
)bankapp
をサンプル・アプリケーションとして実行するためのファイル 次の表は、銀行業務アプリケーションを構成するファイルを示しています。Oracle Tuxedoソフトウェアに同梱のソース・ファイル、bankapp.mk
の実行時に生成されるファイル、および各ファイルの簡単な説明がまとめられています。
bankclt
ファイルには、bankapp
アプリケーションからOracle Tuxedoサービスをリクエストするクライアント・プログラムが定義されています。このクライアント・プログラムはテキスト形式で、次のオプションが提供されています。
これらの各オプションは、アプリケーションの終了を除き、次のタスクを実行するサブルーチンを呼び出します:
注1かっこ内の数値は、そのフィールドでのFMLオカレンスの数です。
do_tpcall()
関数(bankclt.c
の447行で始まる)は次のとおりです:
/*
* This function does the tpcall to Tuxedo.
*/
static int
do_tpcall(char *service)
{
long len;
char *server_status;
/* Begin a Global transaction */
if (tpbegin(30, 0) == -1) {
(void)fprintf(stderr, "ERROR: tpbegin failed (%s)\n",
tpstrerror(tperrno));
return(-1);
}
/* Request the service with the user data */
if (tpcall(service, (char *)fbfr, 0, (char **)&fbfr, &len,
0) == -1) {
if(tperrno== TPESVCFAIL && fbfr != NULL &&
(server_status=Ffind(fbfr,STATLIN,0,0)) != 0) {
/* Server returned failure */
(void)fprintf(stderr, "%s returns failure
(%s)\n",
service,server_status);
}
else {
(void)fprintf(stderr,
"ERROR: %s failed (%s)\n", service,
tpstrerror(tperrno));
}
/* Abort the transaction */
(void) tpabort(0);
return(-1);
}
/* Commit the transaction */
if(tpcommit(0) < 0) {
(void)fprintf(stderr, "ERROR: tpcommit failed
(%s)\n",
tpstrerror(tperrno));
return(-1);
}
return(0);
}
tpbegin()
を呼び出して、グローバル・トランザクションを開始します。これにより、すべての処理が1つの単位として実行されます。char *service
)と割り当てられたFMLバッファ(グローバルな*fbfr
ポインタ)を渡して、tpcall()
を呼び出します。tpcall()
がサーバー・エラー(TPSVCERR
)が原因で失敗すると、サーバーからのメッセージをSTATLIN
FMLフィールドに出力します。tpabort()
を使用してトランザクションをロールバックし、-1を返します。tpcall()
がほかのエラーが原因で失敗すると、そのエラー・メッセージを出力します。tpabort()
を使用してトランザクションをロールバックし、-1を返します。tpcall()
が正常に終了すると、tpcommit()
を使用してトランザクションをコミットし、0を返します。注: | unsolfcn() 関数は、クライアントへの非請求メッセージがある場合に呼び出されます。この関数では、STRING 型バッファだけを使用でき、メッセージが出力されます。 |
bankapp
では、Oracle Tuxedoプログラムud(1)
が使用されます。ud(1)は、標準入力からフィールド化バッファを読み取り、それをサービスに送信します。サンプル・アプリケーションでは、ud
はpopulateおよびdriverプログラムで使用されています。
audit
は、ABAL
、TBAL
、ABAL_BID
、およびTBAL_BID
サービスを使用して、銀行単位または支店単位で残高照会を行うリクエスト/レスポンス型のクライアント・プログラムです。このプログラムは、次の2通りの方法で実行できます。
auditのソース・コードは、main()
およびsum_bal()
サブルーチンから構成されます。Oracle Tuxedo ATMI関数は、この両方で使用されます。このプログラムでは、VIEW
型バッファとaud.h
ヘッダー・ファイルで定義された構造体が使用されます。構造体のソース・コードは、VIEW記述ファイルaud.v
に記述されています。
次の擬似コードは、このプログラムのアルゴリズムを示しています。
main()
{
Parse command-line options with getopt();
Join application with tpinit();
Begin global transaction with tpbegin();
If (branch_ID specified) {
Allocate buffer for service requests with tpalloc();
Place branch_ID into the aud structure;
Do tpcall() to "ABAL_BID" or "TBAL_BID";
Print balance for branch_ID;
Free buffer with tpfree();
}
else /* branch_ID not specified */
all subroutine sum_bal();
Commit global transaction with tpcommit();
Leave application with tpterm();
}
sum_bal()
}
Allocate buffer for service requests with tpalloc();
For (each of several representative branch_ID's,
one for each site)
Do tpacall() to "ABAL" or "TBAL";
For (each representative branch_ID) {
Do tpgetrply() wtith TPGETANY flag set
to retrieve replies;
Add balance to total;
Print total balance;
}
Free buffer with tpfree();
}
次は、audit
ソース・コードの2つの主要部分をまとめたものです。
auditcon
は、audit
プログラムの会話型バージョンです。auditcon
のソース・コードでは、会話型通信のためのATMI関数が使用されます。たとえば、クライアントとサーバー間の接続を確立するtpconnect()
、メッセージを送信するtpsend()
、メッセージを受信するtprecv()
が使用されます。
次の擬似コードは、このプログラムのアルゴリズムを示しています。
main()
{
Join the application
Begin a transaction
Open a connection to conversational service AUDITC
Do until user says to quit: {
Query user for input
Send service request
Receive response
Print response on user's terminal
Prompt for further input
}
Commit transaction
Leave the application
}
bankmgr
は、bankapp
の継続的に稼働するクライアントです。このプログラムは、新規口座の開設や$10,000以上の引き出しなど、アプリケーション定義のイベントで特に関心のあるものをサブスクライブします。bankmgr.c
クライアントの詳細は、bankapp
のREADME2
ファイル、またはbankmgr.c
コードを参照してください。
サーバーとは、1つ以上のサービスを提供する実行可能プロセスです。Oracle Tuxedoシステムでは、サーバーはクライアントとして動作するプロセスから継続的にリクエストを受け取り、それを適切なサービスにディスパッチします。サービスとは、アプリケーションの処理を行うために記述されたC言語のサブルーチンです。Oracle Tuxedoアプリケーションは、サービスを提供し、リソース・マネージャにアクセスできるように作成されています。サービス・ルーチンは、Oracle Tuxedoアプリケーション・プログラマが作成します。
データベースと直接やり取りは行わないTRANSFER
サービスを除くすべてのbankapp
サービスのコードは、C言語に埋込み型SQL文が使用されています。TRANSFER
サービスは、XFER
サーバーによって実行されるC言語プログラムです。つまり、ソース・ファイルは.ec
ファイルではなく.c
ファイルです。
bankapp
のすべてのbankapp
サービスでは、アプリケーション・トランザクション管理インタフェース(ATMI)を使用して、次のタスクを実行します。
bankapp
の5つのサーバーは、レスポンス/リクエスト・モードで動作します。このうちの4つは、埋込み型SQL文を使用して、リソース・マネージャにアクセスします。これらのサーバーのソース・ファイル(bankapp
サンプル・アプリケーションのサブディレクトリにあります)には、ファイル名に拡張子として.ec
が付いています。
5番目のサーバーXFER
は振替えに使用されるサーバーで、リソース・マネージャ自体への呼出しは行いません。このサーバーは、TLR
サーバーによって提供されるWITHDRAWAL
サービスおよびDEPOSIT
サービスを呼び出し、口座間の振替えを行います。XFER
では、リソース・マネージャへの呼出しは行われず、埋込み型SQL文が使用されていないので、XFER
のソース・ファイルは.c
ファイルです。
AUDITC
は、会話型サーバーの一例です。このサーバーでは、AUDITC
と呼ばれるサービスが提供されます。会話型クライアントauditcon
は、AUDITC
への接続を確立し、そこに監査情報をリクエストします。
AUDITC
はリクエストを評価し、必要な情報を得るために適切なサービス(ABAL
、TBAL
、ABAL_BID
、またはTBAL_BID
)を呼び出します。呼び出されたサービスから応答を受信すると、AUDITC
はその応答をauditcon
に返します。会話型サーバーのサービスは、リクエスト/レスポンス・サービスを呼び出すことができます。別の会話型サーバーとの接続を確立することもできますが、この機能はAUDITC
では提供されていません。
bankapp
では、12種類のリクエスト/レスポンス・サービスが提供されます。bankapp
の各サービス名は、サーバーのソース・コード内にあるC言語の関数名と一致します。
次の擬似コードは、bankapp
の各サービスで使用されるアルゴリズムを示しています。サービスには、BR_ADD
、TLR_ADD
、OPEN_ACCT
、CLOSE_ACCT
、WITHDRAWAL
、DEPOSIT
、INQUIRY
、TRANSFER
、ABAL
、TBAL
、ABAL_BID
、およびTBAL_BID
があります。このサンプル・コードを参考にすると、bankapp
サーバーのソース・コードを理解しやすくなります。
void BR_ADD (TPSVCINFO *transb)
{
-set pointer to TPSVCINFO data buffer;
-get all values for service request from field buffer;
-insert record into BRANCH;
-tpreturn() with success;
}
void TLR_ADD (TPSVCINFO *transb)
{
-set pointer to TPSVCINFO data buffer;
-get all values for service request from fielded buffer;
-get TELLER_ID by reading branch's LAST_ACCT;
-insert teller record;
-update BRANCH with new LAST_TELLER;
-tpreturn() with success;
}
void OPEN_ACCT(TPSVCINFO *transb)
{
-Extract all values for service request from fielded buffer using Fget()
and Fvall();
-Check that initial deposit is positive amount and tpreturn() with
failure if not;
-Check that branch ID is a legal value and tpreturn() with failure if it
is not;
-Set transaction consistency level to read/write;
-Retrieve BRANCH record to choose new account based on branch's LAST_ACCT
field;
-Insert new account record into ACCOUNT file;
-Update BRANCH record with new value for LAST_ACCT;
-Create deposit request buffer with tpalloc(); initialize it for FML with
Finit();
-Fill deposit buffer with values for DEPOSIT service request;
-Increase priority of coming DEPOSIT request since call is from a service;
-Do tpcall() to DEPOSIT service to add amount of initial balance;
-Prepare return buffer with necessary information;
-Free deposit request buffer with tpfree();
tpreturn() with success;
}
void CLOSE_ACCT(TPSVCINFO *transb)
{
-Extract account ID from fielded buffer using Fvall();
-Check that account ID is a legal value and tpreturn() with failure if it
is not;
-Set transaction consistency level to read/write;
-Retrieve ACCOUNT record to determine amount of final withdrawal;
-Create withdrawal request buffer with tpalloc(); initialize it for FML
with Finit();
-Fill withdrawal buffer with values for WITHDRAWAL service request;
-Increase priority of coming WITHDRAWAL request since call is from
a service;
-Do tpcall() to WITHDRAWAL service to withdraw balance of account;
-Delete ACCOUNT record;
-Prepare return buffer with necessary information;
-Free withdrawal request buffer with tpfree();
tpreturn with success;
}
void WITHDRAWAL(TPSVCINFO *transb)
{
-Extract account id and amount from fielded buffer using Fvall() and Fget();
-Check that account id is a legal value and tpreturn() with failure if not;
-Check that withdraw amount (amt) is positive and tpreturn() with failure
if not;
-Set transaction consistency level to read/write;
-Retrieve ACCOUNT record to get account balance;
-Check that amount of withdrawal does not exceed ACCOUNT balance;
-Retrieve TELLER record to get teller's balance and branch id;
-Check that amount of withdrawal does not exceed TELLER balance;
-Retrieve BRANCH record to get branch balance;
-Check that amount of withdrawal does not exceed BRANCH balance;
-Subtract amt to obtain new account balance;
-Update ACCOUNT record with new account balance;
-Subtract amt to obtain new teller balance;
-Update TELLER record with new teller balance;
-Subtract amt to obtain new branch balance;
-Update BRANCH record with new branch balance;
-Insert new HISTORY record with transaction information;
-Prepare return buffer with necessary information;
tpreturn with success;
}
void DEPOSIT(TPSVCINFO *transb)
{
-Extract account id and amount from fielded buffer using Fvall() and Fget();
-Check that account ID is a legal value and tpreturn() with failure if not;
-Check that deposit amount (amt) is positive and tpreturn() with failure if
not;
-Set transaction consistency level to read/write;
-Retrieve ACCOUNT record to get account balance;
-Retrieve TELLER record to get teller's balance and branch ID;
-Retrieve BRANCH record to get branch balance;
-Add amt to obtain new account balance;
-Update ACCOUNT record with new account balance;
-Add amt to obtain new teller balance;
-Update TELLER record with new teller balance;
-Add amt to obtain new branch balance;
-Update BRANCH record with new branch balance;
-Insert new HISTORY record with transaction information;
-Prepare return buffer with necessary information;
tpreturn() with success;
}
void INQUIRY(TPSVCINFO *transb)
{
-Extract account ID from fielded buffer using Fvall();
-Check that account ID is a legal value and tpreturn() with failure if not;
-Set transaction consistency level to read only;
-Retrieve ACCOUNT record to get account balance;
-Prepare return buffer with necessary information;
tpreturn() with success;
}
void TRANSFER(TPSVCINFO *transb)
{
-Extract account ID's and amount from fielded buffer using Fvall()
and Fget();
-Check that both account IDs are legal values and tpreturn() with
failure if not;
-Check that transfer amount is positive and tpreturn() with failure if
it is not;
-Create withdrawal request buffer with tpalloc(); initialize it for
FML with
Finit();
-Fill withdrawal request buffer with values for WITHDRAWAL service request;
-Increase priority of coming WITHDRAWAL request since call is from
a service;
-Do tpcall() to WITHDRAWAL service;
-Get information from returned request buffer;
-Reinitialize withdrawal request buffer for use as deposit request buffer
with Finit();
-Fill deposit request buffer with values for DEPOSIT service request;
-Increase priority of coming DEPOSIT request;
-Do tpcall() to DEPOSIT service;
-Prepare return buffer with necessary information;
-Free withdrawal/deposit request buffer with tpfree();
tpreturn() with success;
}
void ABAL(TPSVCINFO *transb)
{
-Set transaction consistency level to read only;
-Retrieve sum of all ACCOUNT file BALANCE values for the
database of this server group (A single ESQL
statement is sufficient);
-Place sum into return buffer data structure;
tpreturn( ) with success;
}
void TBAL(TPSVCINFO *transb)
{
-Set transaction consistency level to read only;
-Retrieve sum of all TELLER file BALANCE values for the
database of this server group (A single ESQL
statement is sufficient);
-Place sum into return buffer data structure;
tpreturn( ) with success;
}
void ABAL_BID(TPSVCINFO *transb)
{
-Set transaction consistency level to read only;
-Set branch_ID based on transb buffer;
-Retrieve sum of all ACCOUNT file BALANCE values for records
having BRANCH_ID = branch_ID (A single ESQL
statement is sufficient);
-Place sum into return buffer data structure;
tpreturn( ) with success;
}
void TBAL_BID(TPSVCINFO *transb)
{
-Set transaction consistency level to read only;
-Set branch_ID based on transb buffer;
-Retrieve sum of all TELLER file BALANCE values for records
having BRANCH_ID = branch_ID (A single ESQL
statement is sufficient);
-Place sum into return buffer data structure;
tpreturn( ) with success;
}
bankapp
のソース・ファイルには、appinit.c
とutil.c
という2つのC言語サブルーチン・ファイルがあります。
appinit.c
には、アプリケーション固有のtpsvrinit()
とtpsvrdone()
サブルーチンが記述されています。tpsvrinit()
とtpsvrdone()
は、Oracle Tuxedo ATMIの標準main()
に含まれているサブルーチンです。tpsvrinit()
は、デフォルトで2つの関数を呼び出します。リソース・マネージャを開くtpopen()
と、サーバーが起動したことを示すメッセージを記録するuserlog()
です。また、tpsvrdone()
も、デフォルトで2つの関数を呼び出します。リソース・マネージャを閉じるtpclose()
と、サーバーが停止されることを示すメッセージを記録するuserlog()
です。これらのデフォルトのサブルーチンのかわりに、アプリケーション固有のtpsvrinit()
とtpsvrdone()
サブルーチンを使用できます。そのため、アプリケーション固有の初期化処理と停止の前処理を行うことができます。 util.c
にはgetstr()
というサブルーチンが記述されています。これはbankapp
でSQLのエラー・メッセージを処理する場合に使用されます。 bankapp
のソース・ファイルでは、すべてのサービスがサーバーのソース・コードとして参照されるファイルに組み込まれています。これらのファイルはbankapp
サーバーと名前が同じですが、main()
関数が含まれていないので実際にはサーバーではありません。標準main()
は、buildserver
コマンドの実行時にOracle Tuxedo ATMIによって提供されます。
Oracle Tuxedoシステム・アプリケーションを作成する別の方法として、各サービス・サブルーチンを別のファイルに記述する方法があります。この方法を使用して、TLR
サーバーを作成するとします。TLR.ec
ファイルには3つのサービスが定義されています。次の手順に従って、これらのサービスをINQUIRY.ec
、WITHDRAW.ec
、およびDEPOSIT.ec
の3つの.ec
ファイルに分けます。次の手順に従います。
この例で説明するように、1つのソース・ファイルにすべてのサービス関数をコーディングする必要はありません。つまり、ソース・プログラム・ファイルとしてサーバーが存在する必要はまったくありません。様々なソース・ファイルから導出し、buildserver
コマンド行で指定したファイルを介して実行可能なサーバーとして存在することが可能です。これによりサーバーをより自由にビルドできます。
ここでは、bankapp
の実行に必要なファイルとリソースを作成するための手順を順に示します。
環境変数は、bankvar
ファイルに定義されています。このファイルは数多くのコメントが記述された大きな(約185行から構成される)ファイルです。
bankvar
ファイルの内容を確認します。 TUXDIR
パラメータにOracle Tuxedoシステムのディレクトリ構造でのルート・ディレクトリを設定し、エクスポートします。 bankvar
の別のコード行で、APPDIR
に${TUXDIR}/samples/atmi/bankapp
が設定されています。これは、bankapp
ソース・ファイルが置かれるディレクトリです。APPDIR
は、Oracle Tuxedoシステムがアプリケーション固有のファイルを検索するディレクトリです。オリジナルのソース・ファイルを保全するには、bankapp
ファイルを別のディレクトリにコピーします。その場合は、そのディレクトリをそこに入力します。TUXDIR
の下位ディレクトリである必要はありません。 DIPCKEY
に値を設定します。これは、Oracle Tuxedoシステム・データベースのIPCKEY
です。DIPCKEY
の値は、UBBCONFIG
ファイルで指定されたOracle TuxedoシステムのIPCKEY
とは異なる値を指定する必要があります。 注: | bankvar で指定されるほかの変数は、サンプル・アプリケーションで各種の働きをします。独自のアプリケーションを開発する場合は、それらの働きについて認識しておくことが必要です。bankvar にはすべての変数が定義されているので、後で実際のアプリケーションのテンプレートとして使用できます。 |
bankvar
に必要な変更を加えたら、次のようにbankvar
を実行します。 . ./bankvar
# Copyright (c) 1997, 1996 BEA Systems, Inc.
# Copyright (c) 1995, 1994 Novell, Inc.
# Copyright (c) 1993, 1992, 1991, 1990 Unix System Laboratories, Inc.
# All rights reserved
#
# This file sets all the environment variables needed by the TUXEDO software
# to run the bankapp
#
# This directory contains all the TUXEDO software
# System administrator must set this variable
#
if [ -z "${TUXDIR}" ] ; then
if [ ! -z "${ROOTDIR}" ] ; then
TUXDIR=$ROOTDIR
export TUXDIR
fi
fi
TUXDIR=${TUXDIR:?}
#
# Reset LANG if necessary
#
if [ ! -d ${TUXDIR}/locale/C -a -d ${TUXDIR}/locale/english_us ] ; then
export LANG
LANG=english_us.ascii
fi
#
# This directory contains all the user written code
#
# Contains the full path name of the directory that the application
# generator should place the files it creates
#
APPDIR=${TUXDIR}/apps/bankapp
#
# This path contains the shared objects that are dynamically linked at
# runtime in certain environments, e.g., SVR4.
#
LD_LIBRARY_PATH=${TUXDIR}/lib:${LD_LIBRARY_PATH}
#
# Set the path to shared objects in HP-UX
#
SHLIB_PATH=${TUXDIR}/lib:${SHLIB_PATH}
#
# Set the path to shared objects in AIX
#
LIBPATH=${TUXDIR}/lib:/usr/lib:${LIBPATH}
#
# Logical block size; Database Administrator must set this variable
#
BLKSIZE=512
#
# Set default name of the database to be used by database utilities
# and database creation scripts
#
DBNAME=bankdb
#
# Indicate whether database is to be opened in share or private mode
#
DBPRIVATE=no
#
# Set Ipc Key for the database; this MUST differ from the UBBCONFIG
# *RESOURCES IPCKEY parameter
#
DIPCKEY=80953
#
# Environment file to be used by tmloadcf
#
ENVFILE=${APPDIR}/ENVFILE
#
# List of field table files to be used by mc, viewc, tmloadcf, etc.
#
FIELDTBLS=Usysflds,bankflds,creditflds,eventflds
#
FIELDTBLS32=Usysfl32,evt_mib,tpadm
#
# List of directories to search to find field table files
#
FLDTBLDIR=${TUXDIR}/udataobj:${APPDIR}
#
FLDTBLDIR32=${TUXDIR}/udataobj:${APPDIR}
#
# Universal Device List for database
#
FSCONFIG=${APPDIR}/bankdl1
#
# Network address, used in MENU script
#
NADDR=
#
# Network device name
#
NDEVICE=
#
# Network listener address, used in MENU script
#
NLSADDR=
#
# Make sure TERM is set
#
TERM=${TERM:?}
#
# Set device for the transaction log; this should match the TLOGDEVICE
# parameter under this site's LMID in the *MACHINES section of the
# UBBCONFIG file
#
TLOGDEVICE=${APPDIR}/TLOG
#
# Device for binary file that gives the BEA Tuxedo system all its information
#
TUXCONFIG=${APPDIR}/tuxconfig
#
# Set the prefix of the file which is to contain the central user log;
# this should match the ULOGPFX parameter under this site's LMID in the
# *MACHINES section of the UBBCONFIG file
#
ULOGPFX=${APPDIR}/ULOG
#
# System name, used by RUNME.sh
#
UNAME=
#
# List of view files to be used by viewc, tmloadcf, etc.
#
VIEWFILES=aud.V
#
VIEWFILES32=mib_views,tmib_views
#
# List of directories to search to find view files
#
VIEWDIR=${TUXDIR}/udataobj:${APPDIR}
#
VIEWDIR32=${TUXDIR}/udataobj:${APPDIR}
#
# Specify the Q device (if events included in demo)
#
QMCONFIG=${APPDIR}/qdevice
#
# Export all variables just set
#
export TUXDIR APPDIR BLKSIZE DBNAME DBPRIVATE DIPCKEY ENVFILE
export LD_LIBRARY_PATH SHLIB_PATH LIBPATH
export FIELDTBLS FLDTBLDIR FSCONFIG MASKPATH OKXACTS TERM
export FIELDTBLS32 FLDTBLDIR32
export TLOGDEVICE TUXCONFIG ULOGPFX
export VIEWDIR VIEWFILES
export VIEWDIR32 VIEWFILES32
export QMCONFIG
#
# Add TUXDIR/bin to PATH if not already there
#
a="`echo $PATH | grep ${TUXDIR}/bin`"
if [ x"$a" = x ]
then
PATH=${TUXDIR}/bin:${PATH}
export PATH
fi
#
# Add APPDIR to PATH if not already there
#
a="`echo $PATH | grep ${APPDIR}`"
if [ x"$a" = x ]
then
PATH=${PATH}:${APPDIR}
export PATH
fi
#
# Check for other machine types bin directories
#
for DIR in /usr/5bin /usr/ccs/bin /opt/SUNWspro/bin
do
if [ -d ${DIR} ] ; then
PATH="${DIR}:${PATH}"
fi
done
注: | Sun Solarisを使用している場合は、シェルとしてcsh ではなく、/bin/sh を使用し、次のように、PATH の先頭に/usr/5bin を指定する必要があります。 |
PATH=/usr/5bin:$PATH;export PATH
buildserver
(1)コマンドを使用して、Oracle Tuxedo ATMI main()
関数で実行可能ATMIサーバーを作成します。このコマンドではオプションを使用して、出力ファイル、アプリケーションで提供される入力ファイル、各種の方法でOracle Tuxedoシステム・アプリケーションを実行するためのライブラリを指定します。
buildserver
は、cc
コマンドを呼び出します。環境変数のCC
を設定すると別のコンパイル・コマンドを指定でき、CFLAGS
を設定するとコンパイル時と編集時にフラグを設定できます。buildserver
コマンドはbankapp.mk
で使用され、銀行業務アプリケーションの各サーバーをコンパイルしてビルドします。次に、bankapp
の6種類のサーバーについて説明します。
ACCT
サーバーは、OPEN_ACCT
およびCLOSE_ACCT
関数のコードが記述されたACCT.ec
という名前のファイルに導出されます。2手順で作成されます。ACCT.ec
は最初にACCT.o
ファイルにコンパイルされ、このファイルは続いてbuildserver
コマンドに指定されます。これにより、あらゆるコンパイル時のエラーを特定して解決することができます。
次は、buildserver
コマンド行で指定されている各オプションの説明です。
-r
オプションは、実行可能サーバーにリンクされるリソース・マネージャのアクセス・ライブラリを指定します。指定する値は、文字列TUXEDO/SQL
で開始します。-s
オプションは、サーバーの起動時に通知されるサーバーのサービス名を指定します。サービスを実行する関数名がサービス名と異なる場合、関数名が-s
オプションの引数の一部になります。bankapp
では、関数名はサービス名と同じなので、サービス名だけを指定します。サービス名は、すべての文字列を大文字で指定します。たとえば、OPEN_ACCT
サービスは、OPEN_ACCT()
関数で処理されます。ただし、buildserver
の-s
オプションでは、サーバー内のサービスを処理する関数には任意の名前を付けることができます。詳細は、buildserver
(1)のリファレンス・ページを参照してください。システム管理者は、buildserver
コマンドでサーバーを作成した際に使用されたサービスのサブセットだけをサーバーの起動時に利用できるように設定することもできます。 -o
オプションは、実行可能出力ファイルに名前を指定する場合に使用します。名前が指定されていない場合は、SERVER
という名前が付きます。 -f
オプションは、リンク時と編集時に使用されるファイルを指定します。関連情報については、buildserver
(1)リファレンス・ページの-l
を参照してください。ファイルがリストされる順序は、関数の参照、およびその参照がどのライブラリで解決されるかによって決定されます。ソース・モジュールは、関数の参照が解決されるライブラリの前にリストされます。.c
ファイルが存在する場合、それが最初にコンパイルされます。前述の例では、appinit.o
とutil.o
はすでにコンパイルされています。オブジェクト・ファイルは、別個の.o
ファイル、またはアーカイブ(.a
)ファイルにあるファイル・グループです。-f
の引数として1つ以上のファイル名を指定する場合は、二重引用符で各ファイル名を囲む必要があります。-f
の引数としては、1つのファイルまたは二重引用符で囲まれた1つのファイル・リストしか指定できませんが、-f
オプションは1つのコマンド行で必要に応じて何度でも指定できます。 次に、ACCTサーバーを作成するために、buildserver
コマンド行に指定されたオプションで行われる操作を簡単にまとめます。
-r
オプションは、Oracle TuxedoシステムSQLリソース・マネージャを指定します。-s
オプションは、ACCT
サーバーを構成するサービスとして、OPEN_ACCT
サービスとCLOSE_ACCT
サービス(ACCT.ec
ファイルにある同名の関数で定義されるサービス)を指定します。-o
オプションは、実行可能出力ファイルにACCT
という名前を指定します。-f
オプションは、ACCT.o
、appinit.o
、およびutil.o
ファイルがビルドでのリンク時と編集時に使用されることを指定します。 注: | appinit.c ファイルには、システムによって提供されるtpsvrinit() およびtpsvrdone() 関数が含まれています。これらのルーチンの使用方法については、tpservice (3c)のリファレンス・ページを参照してください。 |
BAL
サーバーは、ABAL
、TBAL
、ABAL_BID
、およびTBAL_BID
関数のコードが記述されたBAL.ec
ファイルから生成されます。ACCT.ec
ファイルと同様に、BAL.ec
をコンパイルしてBAL.o
ファイルを生成し、それをbuildserver
コマンドに渡します。そのため、コンパイル・エラーを特定でき、サーバーをビルドする前に修正することができます。
BTADD
サーバーは、BR_ADD
およびTLR_ADD
関数のコードが記述されたBTADD.ec
ファイルから生成されます。BTADD.ec
をコンパイルしてBTADD.o
ファイルを生成し、それをbuildserver
コマンドに渡します。
TLR
サーバーは、DEPOSIT
、WITHDRAWAL
、およびINQUIRY
関数のコードが記述されたTLR.ec
ファイルから生成されます。TLR.ec
をコンパイルしてTLR.o
ファイルを生成し、それをbuildserver
コマンドに渡します。
buildserver
コマンドでTLR
サーバーをビルドします。buildserver -r TUXEDO/SQL \
-s DEPOSIT -s WITHDRAWAL -s INQUIRY \
-o TLR \
-f TLR.o -f util.o -f -lm
注: | 前述のコマンド行の円マークは、改行を明示的に示すために表記されているだけです。コマンドとオプションは1行に入力できます。 |
-r
オプションは、Oracle TuxedoシステムSQLリソース・マネージャを指定します。-s
オプションは、TLR
サーバーを構成するサービスとして、DEPOSIT
、WITHDRAWAL
、およびINQUIRY
を指定します。これらのサービス名は、そのサービスを定義するTLR.ec
ファイルの関数名と同じです。-o
オプションは、実行可能サーバーにTLR
という名前を指定します。-f
オプションは、TLR.o
とutil.o
ファイルがリンク時と編集時に使用されることを指定します。 注: | 前述のサンプル・コードでは、-f を使用して、オプション(-lm )をcc コマンドに渡しています。このコマンドは、buildserver によって呼び出されます。-f に-lm の引数を指定すると、コンパイル時にmathライブラリがリンクされます。 |
コンパイル時に使用できるオプションについては、『UNIX System V User's Reference Manual』のcc
(1)を参照してください。
XFER
サーバーは、TRANSFER
関数のコードが記述されたXFER.c
ファイルから生成されます。XFER.c
をコンパイルしてXFER.o
ファイルを生成し、それをbuildserver
コマンドに渡します。
bankapp
サーバーをビルドする場合、buildserver
コマンドの指定方法を理解していることが大切です。ただし、実際にビルドする場合、makefileにビルドの定義を記述することがよくあります。bankapp
でもその方法が採用されています。
bankapp
には、すべてのスクリプトを実行可能にし、VIEW記述ファイルをバイナリ形式に変換し、アプリケーション・サーバーの作成に必要なすべてのプリコンパイル、コンパイル、およびビルドを行うmakefileが提供されています。また、最初からやりなおす場合にもこのファイルを利用できます。
提供されているbankapp.mk
をそのまま使わずにフィールドを編集した方がよい場合があります。また、説明が必要なフィールドもあります。次にそれらのフィールドについて説明します。
bankapp.mk
ファイルの40行目前後に、次のコメントとTUXDIR
パラメータが記述されています。 #
# Root directory of TUXEDO System. This file must either be edited to set
# this value correctly, or the correct value must be passed via "make -f
# bankapp.mk TUXDIR=/correct/tuxdir", or the build of bankapp will fail.
#
TUXDIR=../..
TUXDIR
パラメータを、Oracle Tuxedoシステム・インストールのルート・ディレクトリの絶対パス名に設定します。 APPDIR
パラメータに設定された値を確認します。bankapp
の場合、APPDIR
にはbankapp
ファイルが置かれたディレクトリ(TUXDIR
の相対パス)が指定されています。次に示すbankapp.mk
のセクションには、APPDIR
の設定についての説明と定義が記述されています。 #
# Directory where the bankapp application source and executables reside.
# This file must either be edited to set this value correctly, or the
# correct value must be passed via "make -f bankapp.mk
# APPDIR=/correct/appdir", or the build of bankapp will fail.
#
APPDIR=$(TUXDIR)/samples/atmi
/bankapp
#
README
ファイルに従って、別のディレクトリにファイルをコピーした場合、APPDIR
にはファイルのコピー先のディレクトリを指定します。makefileを実行すると、そのディレクトリにアプリケーションがビルドされます。 デフォルトでは、bankapp
はデータベース・リソース・マネージャとしてOracle Tuxedo/SQLを使用するように設定されています。その場合、ご使用のシステムにOracle Tuxedoシステム・データベースがインストールされていることが必要です。インストールされていない場合は、RMパラメータにTUXDIR/udataobj/RM
にリストされているリソース・マネージャの名前を設定します。
#
# Resource Manager
#
RM=TUXEDO/SQL
#
注: | Oracle Tuxedo SQLリソース・マネージャは、デモ用のプログラムです。 |
ここでは、bankapp
とリソース・マネージャ(通常はデータベース管理システム)間のインタフェース、およびbankapp
データベースを作成する方法について説明します。bankapp
では、Oracle Tuxedoシステム・データベース、つまりXA準拠のリソース・マネージャのOracle Tuxedo/SQLの機能が使用されます。
注: | Oracle Tuxedo SQLリソース・マネージャは、デモ用のプログラムです。 |
bankapp
データベースの作成方法は、アプリケーションを単一プロセッサ(SHMモード)または複数プロセッサのネットワーク(MPモード)のいずれで起動するかによって異なります。
XA準拠の代替リソース・マネージャでbankapp
を実行するには、各種のファイルを変更する必要があります。ここでは、次の内容について説明します。
bankapp
では、データベースへのすべてのアクセスは埋込み型SQL文で実行されます。そのため、新しいリソース・マネージャでSQLがサポートされている場合は問題がありません。appinit.c
ユーティリティには、tpopen()
とtpclose()
への呼出しが定義されています。
crbank
が代替リソース・マネージャで処理されないことがあります。crbankは、変数をリセットして、crbankdb
を3回実行するだけです。crbankdb
を使用する場合は注意します。次のコード・リストは、crbankdb
スクリプトの最初の部分です。このサンプル・コードの後に、Oracle Tuxedoシステム以外のリソース・マネージャでは機能しないコード部分について説明してあります。#Copyright (c) BEA Systems, Inc.
#All rights reserved
#
# Create device list
#
dbadmin<<!
echo
crdl
# Replace the following line with your device zero entry
${FSCONFIG} 0 2560
!
#
# Create database files, fields, and secondary indices
#
sql<<!
echo
create database ${DBNAME} with (DEVNAME='${FSCONFIG}',
IPCKEY=${DIPCKEY}, LOGBLOCKING=0, MAXDEV=1,
NBLKTBL=200, NBLOCKS=2048, NBUF=70, NFIELDS=80,
NFILES=20, NFLDNAMES=60, NFREEPART=40, NLCKTBL=200,
NLINKS=80, NPREDS=10, NPROCTBL=20, NSKEYS=20,
NSWAP=50, NTABLES=20, NTRANTBL=20, PERM='0666',
STATISTICS='n'
)
create table BRANCH (
BRANCH_ID integer not null,
BALANCE real,
LAST_ACCT integer,
LAST_TELLER integer,
PHONE char(14),
ADDRESS char(60),
primary key(BRANCH_ID)
) with (
FILETYPE='hash', ICF='PI', FIELDED='FML',
BLOCKLEN=${BLKSIZE}, DBLKS=8, OVBLKS=2
)
最初の40行を見れば、変更の必要のあるものと変更しなくてもよいものがわかります。見てわかるように、crbankdb
は、dbadmin
およびsql
シェル・コマンドに対する入力情報を提供する2つのドキュメントで構成されています。1つ目のhere
ファイルは、データベースのデバイス・リスト作成のためにOracle Tuxedoシステム・コマンドdbadmin
に渡されます。
このコマンドは、Oracle Tuxedoリソース・マネージャだけで機能します。表スペースを作成したり、適切な権限を認めるために、ほかのコマンドが必要になる場合があります。
GROUPS
セクションで、TMSNAME
およびOPENINFO
パラメータに適切な値(つまり、リソース・マネージャで認識される値)を指定します。
nt\bankvar.cmd
を編集し、次の環境変数に適切な値を指定します。TUXDIR
: Root directory for the BEA TUXEDO system installation
APPDIR
: Application directory in whichbankapp
files are located
ORACLE_HOME
: Root directory of the Oracle8 installation
ORACLE_SID
: Oracle System ID
BLK_SIZE
: Logical block size
DBNAME
: default name of the database to be used by database utilities and database creation scripts
DBPRIVATE
: indicates whether database is to be opened in share or private mode (yes or no)
FSCONFIG
:Universal Device List for database
PATH=%TUXDIR%\bin;%TUXDIR%\include;%TUXDIR%\lib;%ORACLE_HOME%\bin;%PATH%
INCLUDE=%ORACLE_HOME%\rdbms80\xa; %ORACLE_HOME%\pro80\c\include;%include%
NLSPATH=%TUXDIR%\locale\C
PLATFORM=inwnt40
LIB=%TUXDIR%\lib; %ORACLE_HOME%\pro80\lib\msvc; %ORACLE_HOME%\rdbms80\xa; %lib%;
>bankvar
TUXDIR\udataobj\RM
ファイルを編集します。$TUXDIR\udataobj\RM
ファイルに次の行を追加します。Oracle_XA;xaosw;%ORACLE_HOME
%\pro80\lib\msvc\sqllib80.lib%ORACLE_HOME
%\RDBMS80\XA\xa80.lib
Oracleがネットワーク上にある場合は、次のように編集します。
$TUXDIR\udataobj\RM
ファイルに次の行を追加します。Oracle_XA;xaosw;f:\orant\pro80\lib\msvc\sqllib80.lib f:\orant\RDBMS80\XA\xa80.lib
RM
ファイルで、Oracle_XAの以前のエントリを削除します。cd $APPDIR
buildtms -r Oracle_XA -o TMS_ORA
nt\bankapp.mak
ファイルを編集します。*.ec
ファイルを更新します。Oracle SQLコマンドを使用します。copy nt\bankapp.mak to %APPDIR%
nmake -f bankapp.mak
nt\ubbshm
を編集します。USER_ID=0
GROUP_ID=0
UNAME_SITE1=nodename returned by hostname
TUXDIR=same as specified in bankvar
APPDIR=same as specified in bankvar
GROUPS
セクションを変更します。TMSNAME=TMS_ORA
BANKB1 GRPNO=1 OPENINFO="Oracle_XA:Oracle_XA+Acc=P/user1/PaSsWd1+SesTm=0+LogDir=."
[
Oracle_XA +
required fields:
Acc=P/oracle_user_id/oracle_password +
SesTm=Session_time_limit (maximum time a transaction can be inactive) +
optional fields:
LogDir=logdir (where XA library trace file is located) +
MaxCur=maximum_#_of_open cursors +
SqlNet=connect_string (if Oracle exists over the network)
(eg. SqlNet=hqfin@NEWDB indicates the database with sid=NEWDB accessed at host hqfin by TCP/IP)
]
BANKB2 GRPNO=2
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/user2/PaSsWd2+SesTm=0+LogDir=."
BANKB3 GRPNO=3
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/user3/PaSsWd3+SesTm=0+LogDir=."
tmloadcf -y nt/ubbshm
TLOG
デバイスを作成します。crtlog -m
tmboot -y
v$XATRANS$
ビューがデータベースにあることを確認します。V$XATRANS$
ビューは、XAライブラリのインストール時に作成されます。v$XATRANS$
ビューが作成されていない場合は、次のように作成します。bankapp
データベースとOracle RMのデータベース・オブジェクトを作成します。notepad crbank-ora8.sql
bankapp
アプリケーションでこのデータベースを使用できます。sql
スクリプトによってデータベース内に新しい表スペースが作成され、bankapp
のすべてのデータベース・オブジェクトを格納できます。新しい表スペースを使用するには、Oracleシステム・ユーザー・パスワードとファイルの絶対パス名を入力する必要があります。crbank-ora8.sql
を編集します。WHENEVER OSERROR EXIT ;
/*Obtain the password for user "system" */
PROMPT
PROMPT
PROMPT -- Some of the operations require "system" user privileges
PROMPT -- Please specify the Oracle "system" user password
PROMPT
ACCEPT syspw CHAR PROMPT 'system passwd:' HIDE ;
CONNECT system/&syspw ;
SHOW user ;
PROMPT
/* Create a new tablespace in the default DB for use with "bankapp" */
DROP TABLESPACE bank1
INCLUDING CONTENTS
CASCADE CONSTRAINTS;
PROMPT
PROMPT
PROMPT -- Will create a 3MB tablespace for bankapp ;
PROMPT -------- Please specify full pathname below for Datafile ;
PROMPT -------- Ex: %ORACLE_HOME%/dbs/bankapp.dbf
PROMPT
ACCEPT datafile CHAR PROMPT 'Datafile:' ;
CREATE TABLESPACE bank1
DATAFILE '&datafile' SIZE 3M REUSE
DEFAULT STORAGE (INITIAL 10K NEXT 50K
MINEXTENTS 1 MAXEXTENTS 120
PCTINCREASE 5)
ONLINE;
/***************** Create a user called "user1" ***************/
DROP USER user1 CASCADE;
PROMPT Creating user "user1"
CREATE USER user1 IDENTIFIED by PaSsWd1
DEFAULT TABLESPACE bank1
QUOTA UNLIMITED ON bank1 ;
GRANT CREATE SESSION TO user1 ;
GRANT CREATE TABLE TO user1 ;
CONNECT user1/PaSsWd1 ;
SHOW user ;
PROMPT Creating database objects for user "user1" ;
PROMPT Creating table "branch" ;
CREATE TABLE branch (
branch_id NUMBER NOT NULL PRIMARY KEY,
balance NUMBER,
last_acct NUMBER,
last_teller NUMBER,
phoneCHAR(14),
address CHAR(60)
)
STORAGE (INITIAL 5K NEXT 2K
MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 5) ;
PROMPT Creating table "account" ;
CREATE TABLE account (
account_id NUMBER NOT NULL PRIMARY KEY,
branch_id NUMBER NOT NULL,
ssn CHAR(12) NOT NULL,
balance NUMBER,
acct_type CHAR,
last_name CHAR(20),
first_name CHAR(20),
mid_init CHAR,
phoneCHAR(14),
address CHAR(60)
)
STORAGE (INITIAL 50K NEXT 25K
MINEXTENTS 1 MAXEXTENTS 50 PCTINCREASE 5) ;
PROMPT Creating table "teller" ;
CREATE TABLE teller (
teller_id NUMBER NOT NULL PRIMARY KEY,
branch_id NUMBER NOT NULL,
balance NUMBER,
last_name CHAR(20),
first_name CHAR(20),
mid_init CHAR
)
STORAGE (INITIAL 5K NEXT 2K
MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 5) ;
PROMPT Creating table "history" ;
CREATE TABLE history (
account_id NUMBER NOT NULL,
teller_id NUMBER NOT NULL,
branch_id NUMBER NOT NULL,
amount NUMBER
)
STORAGE (INITIAL 400K NEXT 200K
MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 5) ;
SQL*plus> start $APPDIR/ crbank-ora8.sql
nt\populate
driver
bankapp
クライアントを実行します。run
tmshutdown -y
構成ファイルには、アプリケーションの実行方法が定義されています。bankapp
には、テキスト形式の構成ファイル(UBBCONFIG(5)
を参照)が2つ提供されています。単一のコンピュータ上のアプリケーションを定義するubbshm
と、ネットワーク上のアプリケーションを定義するubbmp
です。
初期化スクリプトは、サンプル・アプリケーションに提供されています。また、ご使用の構成およびマシンに合せて、.sh
を使用して10個までの完全な構成ファイルを生成できます。
bankapp
のubbshm
およびubbmp
構成ファイルの内容を確認します。 #Copyright (c) 1999 BEA Systems, Inc.
#All rights reserved
*RESOURCES
IPCKEY 80952
001 UID <user id from id(1)>
002 GID <group id from id(1)>
PERM 0660
MAXACCESSERS 40
MAXSERVERS 35
MAXSERVICES 75
MAXCONV 10
MAXGTT 20
MASTER SITE1,SITE2
SCANUNIT 10
SANITYSCAN 12
BBLQUERY 180
BLOCKTIME 30
DBBLWAIT 6
OPTIONS LAN,MIGRATE
MODEL MP
LDBAL Y
##SECURITY ACL
#
*MACHINES
003 <SITE1's uname> LMID=SITE1
004 TUXDIR="<TUXDIR>"
005 APPDIR="<APPDIR>"
ENVFILE="<APPDIR>/ENVFILE"
TLOGDEVICE="<APPDIR>/TLOG"
TLOGNAME=TLOG
TUXCONFIG="<APPDIR>/tuxconfig"
006 TYPE="<machine type>"
ULOGPFX="<APPDIR>/ULOG"
007 <SITE2's uname> LMID=SITE2
TUXDIR="<TUXDIR>"
APPDIR="<APPDIR>"
ENVFILE="<APPDIR>/ENVFILE"
TLOGDEVICE="<APPDIR>/TLOG"
TLOGNAME=TLOG
TUXCONFIG="<APPDIR>/tuxconfig"
TYPE="<machine type>"
ULOGPFX="<APPDIR>/ULOG"
#
*GROUPS
#
# Group for Authentication Servers
#
Group for Application Queue (/Q) Servers
#
##QGRP1 LMID=SITE1 GRP=102
## TMSNAME=TMS_QM TMSCOUNT=2
## OPENINFO=”TUXEDO/QM:<APPDIR>/qdevice:QSP_BANKAPP”
#
# Group for Event Broker Servers
#
##EVBGRP1 LMID=SITE1 GRPNO=104
DEFAULT: TMSNAME=TMS_SQL TMSCOUNT=2
BANKB1 LMID=SITE1 GRPNO=1
008 OPENINFO="TUXEDO/SQL:<APPDIR>/bankdl1:bankdb:readwrite"
BANKB2 LMID=SITE2 GRPNO=2
OPENINFO="TUXEDO/SQL:<APPDIR>/bankdl2:bankdb:readwrite"
*NETWORK
009 SITE1 NADDR="<network address of SITE1>"
010 NLSADDR="<network listener address of SITE1>"
011 SITE2 NADDR="<network address of SITE2>"
012 NLSADDR="<network listener address of SITE2>"
ubbshm
またはubbmp
のRESOURCES
セクションに次の行を追加します。 SECURITY APP_PW
RESOURCES
、MACHINES
およびGROUPS
セクションにあります。ubbmp
では、NETWORK
セクションにも置換が必要な値があります。表3-3では、ubbmp
をNETWORK
セクションまで示し、単一マシン用のアプリケーションを作成する際、RESOURCES
、MACHINES
およびGROUPS
の各セクションに必要となる変更もすべて説明しています。
バイナリ形式の構成ファイルを作成する場合、bankapp
ファイルが置かれたディレクトリに移動し、環境変数を設定することが必要です。その場合、次の手順に従います。
注: | SHMモードでbankapp を実行する場合は、tlisten プロセスを作成したり、別のマシンにトランザクション・ログを作成する必要はありません。 |
構成ファイルを編集したら、それをMASTER
マシン上にバイナリ・ファイルとしてロードする必要があります。バイナリ形式の構成ファイルの名前はTUXCONFIG
、そのパス名はTUXCONFIG
環境変数に定義されています。このファイルは、Oracle Tuxedoのシステム管理者の有効なユーザーIDおよびグループIDを持つユーザーが作成し、この2つのIDは、ご使用の構成ファイルのUID
およびGID
の値と同じであることが必要です。同じではない場合、bankapp
の実行時にパーミッションの問題が発生します。
TUXCONFIG
は、MASTER
マシン上だけにインストールできます。アプリケーションの起動時にtmboot
によってほかのマシンに伝播されます。
構成のオプションとしてSECURITY
が指定されている場合、tmloadcf
の実行時にアプリケーション・パスワードの入力が求められます。30文字までのパスワードを指定できます。アプリケーションに参加するクライアント・プロセスでは、パスワードを入力する必要があります。
ロードする前にtmloadcf
によってテキスト形式の構成ファイル(UBBCONFIG
)が解析されます。構文エラーが検出された場合、ファイルのロードは失敗します。
TLOG
は、Oracle Tuxedoシステムがグローバル・トランザクションを管理するために使用するトランザクション・ログです。アプリケーションを起動する前に、アプリケーションのすべてのマシン上のすべてのファイルにTLOG
のエントリが作成されることが必要です。また、ログ自体のファイルは、MASTER
マシン上に作成されることが必要です。
bankapp
では、デバイス・リストとTLOG
を作成するcrtlog
と呼ばれるスクリプトが提供されています。デバイス・リストは、bankvar
のTLOGDEVICE
変数を使用して作成されます。
XA準拠ではないリソース・マネージャを使用している場合、トランザクション・ログは不要です。
tlisten
はリスナー・プロセスで、Oracle Tuxedoアプリケーションのマシン間でtmboot
などのプロセスにリモート・サービス接続を提供します。構成ファイルのNETWORK
セクションで定義されたネットワーク上のすべてのマシンにインストールされていることが必要です。
tlisten
の起動については、『Oracle Tuxedoシステムのインストール』の「tlistenプロセスの開始」を参照してください。
bankapp
用に新たにtlisten
プロセスを起動することをお薦めします。その場合、次のコマンドを入力します。tlisten -l nlsaddr
nlsaddr
の値は、構成ファイルでこのマシンのNLSADDR
パラメータに指定された値と同じにする必要があります。この値はマシンによって異なるため、tlisten
の引数が構成ファイルで指定された値と一致していることが重要です。
注: | この指定に関するエラーは、簡単には検出できません。tmloadcf では、構成ファイルの値とtlisten コマンドの引数が一致しているかどうかは確認されません。この2つのアドレスが異なる場合、nlsaddr の値が一致しないマシンで起動に失敗します。また、tlisten プロセスが開始されていないマシンでも起動に失敗します。 |
tlisten
で使用されるログ・ファイルは、Oracle Tuxedoシステムのほかのすべてのログ・ファイルとは別のログ・ファイルです。ただし、複数のtlisten
プロセスで1つのログ・ファイルを使用できます。デフォルトのファイル名は、TUXDIR/udataobj/tlog
です。
tlisten
は、デーモン・プロセスとして実行されます。tlistenを起動スクリプトに組み込んだり、cronジョブとして実行する方法については、Oracle Tuxedoリファレンス・マニュアルの「tlisten(1)」
を参照してください。
bankapp
では、必要に応じて単にそれを開始するか停止するかのみを選択できます。停止するには、次のようにSIGTERM
シグナルを送信します。
注: | Windows 2003環境でリスナー・プロセスを開始または停止するには、コマンド行でtlisten を実行するか、またはコントロール・パネルを使用します。 |
実行中のリモートtlisten
がない場合、起動シーケンスが画面に次のように表示されます。
Booting admin processes
exec DBBL -A :
on MASTER -> process id=17160Started.
exec BBL -A :
on MASTER -> process id=17161Started.
exec BBL -A :
on NONMAST2 -> CMDTUX_CAT:814: cannot propagate TUXCONFIG file
tmboot: WARNING: No BBL available on site NONMAST2.
Will not attempt to boot server processes on that site.
exec BBL -A :
on NONMAST1 -> CMDTUX_CAT:814: cannot propagate TUXCONFIG file
tmboot: WARNING: No BBL available on site NONMAST1.
Will not attempt to boot server processes on that site.
2 processes started.
and messages such as these will be in the ULOG:
133757.mach1!DBBL.17160: LIBTUX_CAT:262: std main starting
133800.mach1!BBL.17161: LIBTUX_CAT:262: std main starting
133804.mach1!BRIDGE.17162: LIBTUX_CAT:262: std main starting
133805.mach1!tmboot.17159: LIBTUX_CAT:278: Could not contact NLS on NONMAST2
133805.mach1!tmboot.17159: LIBTUX_CAT:276: No NLS available for remote
machine NONMAST2
133806.mach1!tmboot.17159: LIBTUX_CAT:276: No NLS available for remote
machine NONMAST2
133806.mach1!tmboot.17159: CMDTUX_CAT:850: Error sending TUXCONFIG
propagation request to TAGENT on NONMAST2
133806.mach1!tmboot.17159: WARNING: No BBL available on site NONMAST2.
Will not attempt to boot server processes on that site.
133806.mach1!tmboot.17159: LIBTUX_CAT:278: Could not contact NLS on NONMAST1
133806.mach1!tmboot.17159: LIBTUX_CAT:276: No NLS available for
remote machine NONMAST1
133806.mach1!tmboot.17159: LIBTUX_CAT:276: No NLS available for
remote machine NONMAST1
133806.mach1!tmboot.17159: CMDTUX_CAT:850: Error sending TUXCONFIG
propagation request to TAGENT on NONMAST1
133806.mach1!tmboot.17159: WARNING: No BBL available on site NONMAST1.
Will not attempt to boot server processes on that site.
If tlisten is started with the wrong machine address, the following messages
appear in the tlisten log.
Mon Aug 26 10:51:56 1991; 14240; Oracle TUXEDO System Listener Process Started
Mon Aug 26 10:51:56 1991; 14240; Could not establish listening endpoint
Mon Aug 26 10:51:56 1991; 14240; Terminating listener process, SIGTERM
ここでは、bankapp
を起動し、各種のクライアント・プログラムとトランザクションを行ってテストし、終了する手順について順に説明します。各作業をクリックすると、その作業を行う手順が表示されます。
bankapp
を起動する前に、アプリケーションをサポートするのに十分なIPCリソースがマシンにあることを確認します。IPCリソースに関するレポートを出力するには、tmboot
コマンドに-c
オプションを指定します。注: | IPCリソースが不足していると起動が失敗する場合があるので、構成に対して適切な値が指定されていることを確認してください。 |
Ipc sizing (minimum /T values only)
Fixed Minimums Per Processor
SHMMIN: 1
SHMALL: 1
SEMMAP: SEMMNI
Variable Minimums Per Processor
SEMUME, A SHMMAX
SEMMNU, * *
Node SEMMNS SEMMSL SEMMSL SEMMNI MSGMNI MSGMAP SHMSEG
------ ------ ------ ------ ------ ------ ------ ------
sfpup 60 1 60 A + 1 10 20 76K
sfsup 63 5 63 A + 1 11 22 76K
where 1 <= A <= 8.
MSGMNI
値に追加します。MSGMAP
はMSGMNI
の2倍にします。
このレポートは、構成内のすべてのサーバーが起動するまで出力されます。起動したサーバーの合計数が出力された時点で終了します。
必要であれば、構成の一部のサーバーだけを起動することもできます。たとえば、管理サーバーだけを起動するには、-A
オプションを指定します。オプションが指定されていない場合は、アプリケーション全体が起動します。
tmboot
では、起動したサーバー数がレポートされるほかに、ULOG
にメッセージが送信されます。
populate.sh
は、データベースにレコードを追加するシェル・スクリプトです。このスクリプトを使用して、bankapp
を実行して、その機能をテストします。populate
は、gendata
と呼ばれるプログラムからシステム・サーバーud
にレコードを渡す1行のスクリプトです。gendata
プログラムは、10支店、30窓口、200口座のレコードを作成します。作成されたファイル内のレコードは、pop.out
に記録されるので、サービス・リクエストの作成時にデータベースの値を使用することができます。
スクリプトを実行するには、「populate」
と入力します。
注: | populateスクリプトで出力されたpop.out では、口座番号や支店番号などのフィールドを指定して取得できるので、自分のサービス・リクエストに対する出力を生成できます。 |
bankapp
に環境変数を設定する必要があります。その場合、次のコマンドを入力します。. ./bankvar
audit
クライアント・プログラムを実行します。audit
クライアント・プログラムを実行するには、次のコマンドを入力します。audit {-a | -t} [branch_id]
口座残高を取得する場合は-a
、窓口残高を取得する場合は-t
を指定します。branch_id
が指定されている場合、指定された支店だけがレポートされます。指定されていない場合、すべての支店データがレポートされます。口座番号、支店番号などauditに入力する値には、populateプログラムの出力であるpop.out
にリストされている値を使用できます。
auditcon
を実行します。auditプログラムの会話型バージョンを起動するには、次のコマンドを入力します。 auditcon
to request a TELLER or ACCOUNT balance for a branch,
type the letter t or a, followed by the branch id,
followed by <return>
for ALL TELLER or ACCOUNT balances, type t or a <return>
q <return> quits the program
リクエストを入力して[Return]を押すと、指定された情報と次のメッセージが表示されます。
another balance request ??
q
を入力するまで繰り返し表示されます。 -n
オプションを使用します。コマンドは次のとおりです。driver -n1000
このコマンドは、プログラムが1000回ループして実行されることを指定しています。
driver
は、システム上での処理をシミュレートするための一連のトランザクションを生成するスクリプトです。このスクリプトは、bankapp
の一部として含まれているので、tmadmin
コマンドを実行して実際的な統計を取得できます。
bankapp
を終了するには、次のように、引数を指定せずにtmshutdown(1)
コマンドをMASTER
マシンで入力します。
$ tmshutdown
Shutdown all server processes? (y/n): y
Shutting down all server processes in /usr/me/BANKAPP/TUXCONFIG
Shutting down server processes ...
Server Id = 1 Group Id = BANKB1 Machine = Site1: shutdown succeeded.
このコマンド(またはtmadmin
の停止コマンド)を実行すると、次のタスクが行われます。