|
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 行目以降) のサンプル コードです。
/*
* この関数は Tuxedo への tpcall を実行します。
*/
static int
do_tpcall(char *service)
{
long len;
char *server_status;
/* グローバル トランザクションの開始 */
if (tpbegin(30, 0) == -1) {
(void)fprintf(stderr, "ERROR: tpbegin failed (%s)\n",
tpstrerror(tperrno));
return(-1);
}
/* ユーザ データでサービスを要求 */
if (tpcall(service, (char *)fbfr, 0, (char **)&fbfr, &len,
0) == -1) {
if(tperrno== TPESVCFAIL && fbfr != NULL &&
(server_status=Ffind(fbfr,STATLIN,0,0)) != 0) {
/* サーバの返信が失敗 */
(void)fprintf(stderr, "%s returns failure
(%s)\n",
service,server_status);
}
else {
(void)fprintf(stderr,
"ERROR: %s failed (%s)\n", service,
tpstrerror(tperrno));
}
/* トランザクションのアボート */
(void) tpabort(0);
return(-1);
}
/* トランザクションのコミット */
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()
{
getopt() でコマンドライン オプションを解析;
tpinit() でアプリケーションに参加;
tpbegin() でグローバル トランザクションを開始;
If (branch_ID が指定されている) {
tpalloc() でサービス要求にバッファを割り当て;
branch_ID を aud 構造体に格納;
「ABAL_BID」または「TBAL_BID」に対して tpcall() を実行;
branch_ID の残高を出力;
tpfree() でバッファを開放;
}
else /* branch_ID が指定されていない場合 */
サブルーチン sum_bal() を呼び出す;
tpcommit() でグローバル トランザクションをコミット;
tpterm() でアプリケーションを終了;
}
sum_bal()
}
tpalloc() でサービス要求にバッファを割り当て;
For (いくつかの代表 branch_ID のそれぞれについて
各サイトごとに 1 つずつ)
「ABAL」または「TBAL」に対して tpcall() を実行;
For (各代表 branch_ID) {
TPGETANY フラグをセットして tpgetrply() を実行して
応答を取得;
残高を合計に追加;
残高合計を出力;
}
tpfree() でバッファを開放;
}
以下は、audit
ソース コードの構成要素である main() および sum_bal() で行われる処理をまとめたものです。
auditcon
は、audit
プログラムの会話型バージョンです。auditcon
のソース コードでは、会話型通信のための ATMI 関数が使用されます。たとえば、クライアントとサーバ間の接続を確立する tpconnect()
、メッセージを送信する tpsend()
、メッセージを受信する tprecv()
が使用されます。
次の擬似コードは、このプログラムのアルゴリズムを示しています。
main()
{
アプリケーションに参加
トランザクションを開始
会話型サービス AUDITC への接続を開く
ユーザが終了するまで繰り返す: {
ユーザに入力を促す
サービス要求を送信
応答を受信
応答をユーザ端末に出力
次の入力を促す
}
トランザクションをコミット
アプリケーションを終了
}
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)
{
TPSVCINFO データ バッファへのポインタを設定;
フィールド化バッファからサービス要求に関連するすべての値を取得;
BRANCH にレコードを挿入;
tpreturn() で成功を示す値を返す;
}
void TLR_ADD (TPSVCINFO *transb)
{
TPSVCINFO データ バッファへのポインタを設定;
フィールド化バッファからサービス要求に関連するすべての値を取得;
支店の LAST_ACCT を読み取り TELLER_ID を取得;
窓口レコードの挿入;
新たな LAST_TELLER で BRANCH を更新;
tpreturn() で成功を示す値を返す;
}
void OPEN_ACCT(TPSVCINFO *transb)
{
Fget() および Fvall() で、フィールド化バッファからサービス要求に関連する
すべての値を抽出;
預け入れ金額が正の値であるか確認し、正でない場合は tpreturn() で
エラーを示す値を返す;
口座番号が妥当であるか確認し、妥当でなければ tpreturn() で
エラーを示す値を返す;
トランザクション整合性レベルを、読み取り/書き込みに設定;
支店の LAST_ACCT フィールドに基づき、BRANCH レコードを検索し、新たな
口座番号を選択;
ACCOUNT ファイルに新たな口座レコードを挿入;
LAST_ACCT の新しい値で BRANCH レコードを更新;
tpalloc() で預け入れ要求バッファを割り当て、Finit() で初期化し
FML タイプとして使用;
DEPOSIT サービス要求への値を預け入れバッファに格納;
サービスからの呼び出しにより DEPOSIT 要求の優先順位を上げる;
tpcall() で DEPOSIT サービスを呼び出し、初期残高を加算;
必要な情報を含む応答バッファを用意;
tpfree() で預け入れ要求バッファを解放;
tpreturn() で成功を示す値を返す;
}
void CLOSE_ACCT(TPSVCINFO *transb)
{
Fvall() でフィールド化バッファから口座番号を抽出;
口座番号が妥当であるか確認し、妥当でなければ tpreturn() で
エラーを示す値を返す;
トランザクション整合性レベルを、読み取り/書き込みに設定;
最終的な引き出し金額の確認のため、ACCOUNT レコードを検索;
tpalloc() を使用して引き出し要求バッファを割り当て、Finit() で初期化し
FML タイプとして使用;
WITHDRAWAL サービス要求への値を引き出しバッファに格納;
サービスからの呼び出しにより WITHDRAWAL 要求の
優先順位を上げる;
tpcall() で WITHDRAWAL サービスを呼び出し、口座残高を引き出す;
ACCOUNT レコードを削除;
必要な情報を含む応答バッファを用意;
tpfree() で引き出し要求バッファを解放;
tpreturn() で、成功を示す値を返す;
}
void WITHDRAWAL(TPSVCINFO *transb)
{
Fvall() および Fget() で、フィールド化バッファから口座番号と金額を抽出;
口座番号が妥当であるか確認し、妥当でなければ tpreturn() でエラーを示す値を返す;
引き出し金額が正の値であるか確認し、正でなければ tpreturn() で
エラーを示す値を返す;
トランザクション整合性レベルを、読み取り/書き込みに設定;
口座残高を取得するため、 ACCOUNT レコードを検索;
引き出し金額が ACCOUNT で示される残高を超えないか確認;
窓口残高と支店番号を取得するため、TELLER レコードを検索;
引き出し金額が TELLER の残高を超えないか確認;
支店残高を取得するため、BRANCH レコードを検索;
引き出し金額が BRANCH の残高を超えないか確認;
引き出し金額を減算し、新たな口座残高を決定;
新たな口座残高で ACCOUNT レコードを更新;
引き出し金額を減算し、新たな窓口残高を決定;
新たな窓口残高で TELLER レコードを更新;
引き出し金額を減算し、新たな支店残高を決定;
新たな支店残高で BRANCH レコードを更新;
トランザクション情報と共に、新たな HISTORY レコードを挿入;
必要な情報を含む応答バッファを用意;
tpreturn() で、成功を示す値を返す;
}
void DEPOSIT(TPSVCINFO *transb)
{
Fvall() および Fget() で、フィールド化バッファから口座番号と金額を抽出;
口座番号が妥当であるか確認し、妥当でなければ tpreturn() でエラーを示す値を返す;
預け入れ金額が正の値であるか確認し、正でなければ tpreturn() で
エラーを示す値を返す;
トランザクション整合性レベルを、読み取り/書き込みに設定;
口座残高を取得するため、ACCOUNT レコードを検索;
窓口残高と支店番号を取得するため、TELLER レコードを検索;
支店残高を取得するため、BRANCH レコードを検索;
預け入れ金額を加算し、新たな口座残高を決定;
新たな口座残高で ACCOUNT レコードを更新;
預け入れ金額を加算し、新たな窓口残高を決定;
新たな窓口残高で TELLER レコードを更新;
預け入れ金額を加算し、新たな支店残高を決定;
新たな支店残高で BRANCH レコードを更新;
トランザクション情報と共に、新たな HISTORY レコードを挿入;
必要な情報を含む応答バッファを用意;
tpreturn() で成功を示す値を返す;
}
void INQUIRY(TPSVCINFO *transb)
{
Fvall() でフィールド化バッファから口座番号を抽出;
口座番号が妥当であるか確認し、妥当でなければ tpreturn() でエラーを示す値を返す;
トランザクション整合性レベルを、読み取りのみに設定;
口座残高を取得するため、ACCOUNT レコードを検索;
必要な情報を含む応答バッファを用意;
tpreturn() で成功を示す値を返す;
}
void TRANSFER(TPSVCINFO *transb)
{
Fvall() および Fget() で、フィールド化バッファから、口座番号と
金額を抽出;
口座番号が両方とも妥当であるか確認し、妥当でない場合は、tpreturn() で
エラーを示す値を返す;
振り替え金額が正の値であるか確認し、正でない場合は tpreturn() で
エラーを示す値を返す;
tpalloc() を使用して引き出し要求バッファを割り当て、
Finit() で初期化し
FML タイプとして使用;
WITHDRAWAL サービス要求への値を引き出し要求バッファに格納;
サービスからの呼び出しにより WITHDRAWAL 要求の
優先順位を上げる;
tpcall() で WITHDRAWAL サービスを呼び出す;
応答要求バッファから情報を取得;
預け入れ要求バッファとして使用するため、引き出し要求バッファを Finit() により
再度初期化;
DEPOSIT サービス要求への値を預け入れ要求のバッファに格納;
DEPOSIT 要求の優先順位を上げる;
tpcall() で DEPOSIT サービスを呼び出す;
必要な情報を含む応答バッファを用意;
tpfree() で引き出し/預け入れ要求バッファを解放;
tpreturn() で成功を示す値を返す;
}
void ABAL(TPSVCINFO *transb)
{
トランザクション整合性レベルを、読み取りのみに設定;
ABAL サーバ グループのデータベースで、ACCOUNT ファイルの
すべての BALANCE 値の合計を検索
(単一の ESQL 文で十分);
合計を応答バッファ データ構造体へ格納;
tpreturn() で成功を示す値を返す;
}
void TBAL(TPSVCINFO *transb)
{
トランザクション整合性レベルを、読み取りのみに設定;
TBAL サーバ グループのデータベースで、TELLER ファイルの
すべての BALANCE 値の合計を検索
(単一の ESQL 文で十分);
合計を応答バッファ データ構造体へ格納;
tpreturn() で成功を示す値を返す;
}
void ABAL_BID(TPSVCINFO *transb)
{
トランザクション整合性レベルを、読み取りのみに設定;
transb バッファに基づき、branch_ID を設定;
BRANCH_ID = branch_ID に該当するレコードの中で、ACCOUNT ファイルの
すべての BALANCE 値の合計を検索
(単一の ESQL 文で十分);
合計を応答バッファ データ構造体へ格納;
tpreturn() で成功を示す値を返す;
}
void TBAL_BID(TPSVCINFO *transb)
{
トランザクション整合性レベルを、読み取りのみに設定;
transb バッファに基づき、branch_ID を設定;
BRANCH_ID = branch_ID に該当するレコードの中で、TELLER ファイルの
すべての BALANCE 値の合計を検索
(単一の ESQL 文で十分);
合計を応答バッファ データ構造体へ格納;
tpreturn() で成功を示す値を返す;
}
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
コマンドラインに指定されたファイルに基づいて 1 つの実行可能サーバとしてビルドできます。この方法により、サーバを柔軟にビルドできるようになります。
ここでは、bankapp
の実行に必要なファイルとリソースを作成するための手順を順に示します。
環境変数は、bankvar
ファイルに定義されています。このファイルは数多くのコメントが記述された大きな (約 185 行から構成される) ファイルです。
bankvar
ファイルの内容を確認します。 TUXDIR
パラメータに Oracle Tuxedo システムのディレクトリ構造でのルート ディレクトリを設定し、エクスポートします。 bankvar
の別のコード行で、APPDIR
に ${TUXDIR}/samples/atmi/bankapp
が設定されています。これは、bankapp
ソース ファイルが置かれたディレクトリです。APPDIR
は、Oracle Tuxedo システムによって、アプリケーション固有のファイルが検索されるディレクトリです。オリジナルのソース ファイルを上書きしないように、bankapp
ファイルを別のディレクトリにコピーします。その場合は、そのディレクトリを APPDIR に指定します。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
#
# このファイルには、bankapp を実行するために
# Tuxedo システムで必要なすべての環境変数が設定されています。
#
# このディレクトリには、すべての Tuxedo ソフトウェアが置かれています。
# システム管理者はこの変数を設定する必要があります。
#
if [ -z "${TUXDIR}" ] ; then
if [ !-z "${ROOTDIR}" ] ; then
TUXDIR=$ROOTDIR
export TUXDIR
fi
fi
TUXDIR=${TUXDIR:?}
#
# 必要に応じて LANG を設定し直します。
#
if [ !-d ${TUXDIR}/locale/C -a -d ${TUXDIR}/locale/english_us ] ; then
export LANG
LANG=english_us.ascii
fi
#
# このディレクトリには、ユーザ作成の全コードが置かれています。
#
# アプリケーション ジェネレータによって生成されたファイルが
# 置かれるディレクトリの絶対パス名です。
#
APPDIR=${TUXDIR}/apps/bankapp
#
# SVR4 など特定の環境での実行時に
# 動的にリンクされる共有オブジェクトのパスです。
#
LD_LIBRARY_PATH=${TUXDIR}/lib:${LD_LIBRARY_PATH}
#
# HP-UX の場合に、共有オブジェクトのパスを設定します。
#
SHLIB_PATH=${TUXDIR}/lib:${SHLIB_PATH}
#
# AIX の場合に、共有オブジェクトのパスを設定します。
#
LIBPATH=${TUXDIR}/lib:/usr/lib:${LIBPATH}
#
# 論理ブロック サイズです。データベース管理者はこの変数を設定する必要があります。
#
BLKSIZE=512
#
# データベース ユーティリティおよびデータベース作成スクリプトで使用する
# データベースのデフォルト名を設定します。
#
DBNAME=bankdb
#
# データベースを共有モードで開くか、またはプライベート モードで開くかを指定します。
#
DBPRIVATE=no
#
# データベースの IPC キーを設定します。これは、UBBCONFIG の IPC とは異なる値を指定する必要があります。
# *RESOURCES IPCKEY パラメータ
#
DIPCKEY=80953
#
# tmloadcf で使用される環境ファイルです。
#
ENVFILE=${APPDIR}/ENVFILE
#
# mc、viewc、tmloadcf などで使用されるフィールド テーブル ファイルのリストです。
#
FIELDTBLS=Usysflds,bankflds,creditflds,eventflds
#
FIELDTBLS32=Usysfl32,evt_mib,tpadm
#
# フィールド テーブル ファイルを検索するディレクトリのリストです。
#
FLDTBLDIR=${TUXDIR}/udataobj:${APPDIR}
#
FLDTBLDIR32=${TUXDIR}/udataobj:${APPDIR}
#
# データベースの汎用デバイス リストです。
#
FSCONFIG=${APPDIR}/bankdl1
#
# MENU スクリプトで使用されるネットワーク アドレスです。
#
NADDR=
#
# ネットワーク デバイス名です。
#
NDEVICE=
#
# MENU スクリプトで使用されるネットワーク リスナ アドレスです。
#
NLSADDR=
#
# TERM が設定されていることを確認します。
#
TERM=${TERM:?}
#
# トランザクション ログのデバイスを設定します。これは、
# UBBCBSHM ファイルの *MACHINES セクションにあるこのサイトの LMID の
# TLOGDEVICE パラメータと一致する必要があります。
#
TLOGDEVICE=${APPDIR}/TLOG
#
# BEA Tuxedo システムにすべての情報を提供するバイナリ ファイルのデバイスです。
#
TUXCONFIG=${APPDIR}/tuxconfig
#
# 中央ユーザ ログを記録するファイルの接頭語を設定します。
# これは、UBBCONFIG ファイルの *MACHINES セクションにある
# このサイトの LMID の ULOGPFX パラメータと一致する必要があります。
#
ULOGPFX=${APPDIR}/ULOG
#
# RUNME.sh で使用されるシステム名です。
#
UNAME=
#
# viewc、tmloadcf などで使用される VIEW ファイルのリストです。
#
VIEWFILES=aud.V
#
VIEWFILES32=mib_views,tmib_views
#
# VIEW ファイルを検索するディレクトリのリストです。
#
VIEWDIR=${TUXDIR}/udataobj:${APPDIR}
#
VIEWDIR32=${TUXDIR}/udataobj:${APPDIR}
#
# Q デバイスを指定します (デモにイベントが含まれている場合)。
#
QMCONFIG=${APPDIR}/qdevice
#
# 設定したすべての変数をエクスポートします。
#
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
#
# 設定されていない場合は、TUXDIR/bin を PATH に追加します。
#
a="`echo $PATH | grep ${TUXDIR}/bin`"
if [ x"$a" = x ]
then
PATH=${TUXDIR}/bin:${PATH}
export PATH
fi
#
# 設定されていない場合は、APPDIR を PATH に追加します。
#
a="`echo $PATH | grep ${APPDIR}`"
if [ x"$a" = x ]
then
PATH=${PATH}:${APPDIR}
export PATH
fi
#
# ほかのマシン タイプの bin ディレクトリを確認します。
#
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
ファイルから生成されます。このサーバをビルドするには、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
をそのまま使わずにフィールドを編集した方がよい場合があります。また、説明が必要なフィールドもあります。以下にそれらのフィールドについて説明します。
APPDIR
パラメータに設定された値を確認します。bankapp
の場合、APPDIR
には bankapp
ファイルが置かれたディレクトリ (TUXDIR
の相対パス) が指定されています。次に示す bankapp.mk
のセクションには、APPDIR
の設定についての説明と定義が記述されています。 #
# bankapp アプリケーションのソース コードと実行可能ファイルが置かれたディレクトリです。
# このファイルは、編集してこの値を正しく設定するか、
# または "make -f bankapp.mk APPDIR=/correct/appdir" を使用して正しい値を渡します。
# そのようにしないと、bankapp のビルドは失敗します。
#
APPDIR=$(TUXDIR)/samples/atmi
/bankapp
#
README
ファイルに従って、別のディレクトリにファイルをコピーした場合、APPDIR
にはファイルのコピー先のディレクトリを指定します。makefile を実行すると、そのディレクトリにアプリケーションがビルドされます。
デフォルトでは、bankapp
はデータベース リソース マネージャとして Oracle Tuxedo/SQL を使用するように設定されています。その場合、ご使用のシステムに Oracle Tuxedo システム データベースがインストールされていることが必要です。インストールされていない場合は、RM パラメータに TUXDIR/udataobj/RM
にリストされているリソース マネージャの名前を設定します。
#
# リソース マネージャ
#
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
#
# デバイス リストを作成します。
#
dbadmin<<!
echo
crdl
# 次の行をデバイス 0 のエントリに置き換えます。
${FSCONFIG} 0 2560
!
#
# データベース ファイル、フィールド、および 2 次インデックスを作成します。
#
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
シェルコマンドへの入力から構成されています。最初の here
ファイルは、Oracle Tuxedo システムのコマンド dbadmin
に渡されて、データベースのデバイス リストが作成されます。
このコマンドは、Oracle Tuxedo リソース マネージャだけで機能します。テーブル スペースを作成したり、適切な特権を認めるために、ほかのコマンドが必要になる場合があります。
GROUPS
セクションで、TMSNAME
および OPENINFO
パラメータに適切な値 (つまり、リソース マネージャで認識される値) を指定します。
nt\bankvar.cmd
を編集し、次の環境変数に適切な値を指定します。TUXDIR
: BEA Tuxedo システムのインストール先のルート ディレクトリ
APPDIR
:bankapp
ファイルが置かれたアプリケーション ディレクトリ
ORACLE_HOME
: Oracle8 のインストール先のルート ディレクトリ
ORACLE_SID
: Oracle システム ID
BLK_SIZE
: 論理ブロック サイズ
DBNAME
: データベース ユーティリティおよびデータベース作成スクリプトによって使用されるデータベースのデフォルト名
DBPRIVATE
: データベースを共有モードで開くか、またはプライベート モードで開くかを指定 (yes または no)
FSCONFIG
: データベースの汎用デバイス リスト
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%\pro80lib\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= ホスト名で返されるノード名
TUXDIR= bankvar で指定された値
APPDIR= 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 ;
/* システムのユーザのパスワードを取得します。 */
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
/* デフォルトのデータベースに、「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;
/***************** 「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 <id(1) からのユーザ ID>
002 GID <id(1) からのグループ ID>
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 の名前> LMID=SITE1
004 TUXDIR="<TUXDIR>"
005 APPDIR="<APPDIR>"
ENVFILE="<APPDIR>/ENVFILE"
TLOGDEVICE="<APPDIR>/TLOG"
TLOGNAME=TLOG
TUXCONFIG="<APPDIR>/tuxconfig"
006 TYPE="<マシン タイプ>"
ULOGPFX="<APPDIR>/ULOG"
007 <SITE2 の名前> LMID=SITE2
TUXDIR="<TUXDIR>"
APPDIR="<APPDIR>"
ENVFILE="<APPDIR>/ENVFILE"
TLOGDEVICE="<APPDIR>/TLOG"
TLOGNAME=TLOG
TUXCONFIG="<APPDIR>/tuxconfig"
TYPE="<マシン タイプ>"
ULOGPFX="<APPDIR>/ULOG"
#
*GROUPS
#
# 認証サーバのグループ
#
アプリケーション キュー (/Q) サーバのグループ
#
##QGRP1 LMID=SITE1 GRP=102
## TMSNAME=TMS_QM TMSCOUNT=2
## OPENINFO=”TUXEDO/QM:<APPDIR>/qdevice:QSP_BANKAPP”
#
# イベント ブローカ サーバのグループ
#
##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="<SITE1 のネットワーク アドレス>"
010 NLSADDR="<SITE1 のネットワーク リスナ アドレス>"
011 SITE2 NADDR="<SITE2 のネットワーク アドレス>"
012 NLSADDR="<SITE2 のネットワーク リスナ アドレス>"
ubbshm
または ubbmp
の RESOURCES
セクションに追加します。 SECURITY APP_PW
RESOURCES
、MACHINES
、および GROUPS
セクションにあります。ubbmp
では、NETWORK
セクションにも置き換えが必要な値があります。次の表は、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 ジョブとして実行する方法については、『Tuxedo コマンド リファレンス』の「tlisten(1)
」を参照してください。
bankapp
では、tlisten に対して開始または終了のどちらかの操作しかできません。tlisten を終了するには、次のように SIGTERM
シグナルを送信します。
注意 : | Windows 2003 環境でリスナ プロセスを開始または停止するには、コマンドラインで tlisten を実行するか、またはコントロール パネルを使用します。 |
tlisten
がリモートで実行されていない場合、次のように画面上にブート シーケンスに関するメッセージが表示されます。
TUXEDO 管理プロセスを起動します。
exec DBBL -A :
on MASTER -> プロセス ID=17160 を起動しました。
exec BBL -A :
on MASTER -> プロセス ID=17161 を起動しました。
exec BBL -A :
on NONMAST2 -> CMDTUX_CAT:814: TUXCONFIG を伝播できません。
tmboot: WARNING: NONMAST2 サイトでは BBL が使用可能ではありません。
このサイトではサーバ・プロセスはブートできません。
exec BBL -A :
on NONMAST1 -> CMDTUX_CAT:814: TUXCONFIG を伝播できません。
tmboot: WARNING: NONMAST1 サイトでは BBL が使用可能ではありません。
このサイトではサーバ・プロセスはブートできません。
2 個のプロセスを起動しました。
そして、以下のようなメッセージが ULOG に記録されます。
133757.mach1!DBBL.17160: LIBTUX_CAT:262: サーバの main() が起動しました。
133800.mach1!BBL.17161: LIBTUX_CAT:262: サーバの main() が起動しました。
133804.mach1!BRIDGE.17162: LIBTUX_CAT:262: サーバの main() が起動しました。
133805.mach1!tmboot.17159: LIBTUX_CAT:278: NONMAST2 の NLS にコンタクトできませんでした。
133805.mach1!tmboot.17159: LIBTUX_CAT:276: リモート・マシン NONMAST2 の有効
な NLS がありません。
133806.mach1!tmboot.17159: LIBTUX_CAT:276: リモート・マシン NONMAST2 の有効
な NLS がありません。
133806.mach1!tmboot.17159: CMDTUX_CAT:850: NONMAST2 の TAGENT への
TUXCONFIG 伝達要求の送信でエラーが発生しました。
133806.mach1!tmboot.17159: WARNING: NONMAST2 サイトでは BBL が使用可能ではありません。
このサイトではサーバ・プロセスはブートできません。
133806.mach1!tmboot.17159: LIBTUX_CAT:278: NONMAST1 の NLS にコンタクトできませんでした。
133806.mach1!tmboot.17159: LIBTUX_CAT:276: リモート・マシン NONMAST1 の有効
な NLS がありません。
133806.mach1!tmboot.17159: LIBTUX_CAT:276: リモート・マシン NONMAST1 の有効
な NLS がありません。
133806.mach1!tmboot.17159: CMDTUX_CAT:850: NONMAST1 の TAGENT への
TUXCONFIG 伝達要求の送信でエラーが発生しました。
133806.mach1!tmboot.17159: WARNING: NONMAST1 サイトでは BBL が使用可能ではありません。
このサイトではサーバ・プロセスはブートできません。
間違ったマシン アドレスで tlisten を起動すると、次のようなメッセージが
tlisten ログに記録されます。
Mon Aug 26 10:51:56 1991; 14240; Oracle TUXEDO システムの Listener プロセスが開始しました。
Mon Aug 26 10:51:56 1991; 14240; 接続指示を受け付けている端点を確立できませんでした。
Mon Aug 26 10:51:56 1991; 14240; リスナ・プロセス SIGTERM を終了します。
ここでは、bankapp
を起動し、各種のクライアント プログラムとトランザクションを行ってテストし、終了する手順について順に説明します。各作業をクリックすると、その作業を行う手順が表示されます。
bankapp
を起動する前に、アプリケーションをサポートするのに十分な IPC リソースがマシンにあることを確認します。IPC リソースに関するレポートを出力するには、tmboot
コマンドに -c
オプションを指定します。注意 : | IPC リソースが不足していると起動が失敗する場合があるので、コンフィグレーションに対して適切な値が指定されていることを確認してください。 |
Ipc の大きさ変更 (/T の最小値のみ)
プロセッサごとの固定した最小値
SHMMIN: 1
SHMALL: 1
SEMMAP: SEMMNI
プロセッサごとの可変の最小値
SEMUME, A SHMMAX
SEMMNU, * *
ノード 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
ここで 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 {-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
要求を入力して〔Enter〕を押すと、指定された情報と次のメッセージが表示されます。
another balance request ??
q
を入力するまで繰り返し表示されます。 -n
オプションを使用します。driver -n1000
このコマンドは、プログラムが 1000 回ループして実行されることを指定しています。
driver
は、システム上での処理をシミュレートするための一連のトランザクションを生成するスクリプトです。このスクリプトは、bankapp
の一部として含まれているので、tmadmin
コマンドを実行して実際的な統計を取得できます。
bankapp
を終了するには、次のように、引数を指定せずに tmshutdown(1)
コマンドを MASTER
マシンで入力します。
$ tmshutdown
すべてのアプリケーションのサーバ・プロセスをシャットダウンさせますか?(y/n): y
/usr/me/BANKAPP/TUXCONFIG のすべてのアプリケーションのサーバ・プロセスをシャットダウンします。
アプリケーションのサーバ・プロセスをシャットダウンします。
サーバ Id = 1 グループ Id = BANKB1 マシン = Site1: シャットダウンしました。
このコマンド (または tmadmin
の停止コマンド) を実行すると、次のタスクが行われます。