サンプルを使用した Oracle Tuxedo アプリケーションの開発方法

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

bankapp (複雑な C 言語アプリケーション) のチュートリアル

ここでは、以下の内容について説明します。

 


bankapp とは

bankapp は、Oracle Tuxedo ソフトウェアに同梱されている、銀行業務の ATMI サンプル アプリケーションです。このアプリケーションでは、口座の開設と解約、残高照会、預け入れまたは引き出し、口座振り替えなどの銀行業務を行うことができます。

このチュートリアルについて

このチュートリアルでは、bankapp アプリケーションを開発して実行するための手順を順に示します。このチュートリアルで bankapp の「開発」を経験すると、独自のアプリケーションを開発できるようになります。

bankapp チュートリアルは、次の 3 つの節から構成されています。

注意 : ここで説明する内容は、アプリケーションの開発、管理、プログラミングに経験のある UNIX および Windows 2003 システムのユーザを対象としています。また、Oracle Tuxedo ソフトウェアについて理解していることを前提としています。

 


bankapp について

このサンプル アプリケーションの手順は、UNIX または Windows 2003 環境で動作するシェル スクリプト RUNME.shRUNME.cmd によって自動化されています。対応する readme ファイルに、これらのファイルの実行方法が説明されています。これらのファイルに目をとおし実行の手順を十分に理解した上で、ここで説明する内容に従って操作をすれば、分散アプリケーションの設定と管理をよりスムーズに行うことができます。

bankapp サンプル アプリケーションでは、ソフトウェアに同梱のデモ版リレーショナル データベースが使用されています。サンプル アプリケーションに用意されたデモ用の各種コマンドと SQL コードを使用して、データベースにアクセスします。

このマニュアルでは、bankapp アプリケーションを構成するファイル、クライアント、およびサービスについて説明します。各作業をクリックすると、その作業を行う手順が表示されます。

 


bankapp のファイルについて

bankapp アプリケーションを構成するファイルは、bankapp ディレクトリに置かれています。このディレクトリは、次の図のように構成されています。

銀行業務アプリケーションのファイルについて

bankapp ディレクトリには、次のファイルが置かれています。

次の表は、銀行業務アプリケーションを構成するファイルを示しています。Oracle Tuxedo ソフトウェアに同梱のソース ファイル、bankapp.mk の実行時に生成されるファイル、および各ファイルの簡単な説明がまとめられています。

表 3-1 銀行業務アプリケーションを構成するファイル
ソース ファイル
生成されるファイル
フィールド値
ACCT.ec
ACCT.c、ACCT.o、ACCT
口座の開設と解約を行う OPEN_ACCT サービスと CLOSE_ACCT サービスが定義されたファイル。
ACCTMGR.c
ACCTMGR
イベント通知およびログ通知をサブスクライブするサーバ。WATCHDOG サービスおよび Q_OPENACCT_LOG サービスが定義されています。
AUDITC.c
AUDITC
auditcon クライアントからのサービス要求を処理する会話型サーバ。
BAL.ec
BAL.c、BAL.o、BAL
audit クライアント プログラムが銀行単位または支店単位で口座残高と窓口残高を取得するための ABAL サービス、TBAL サービス、ABAL_BID サービス、および TBAL_BID サービスが定義されたファイル。
BALC.ec
BALC.c、BALC.o、BALC
ABALC_BID サービスおよび TBALC_BID サービス。この 2 つのサービスは、前述の TBAL_BID および ABAL_BID サービスと同じです。ただし、支店番号が見つからない場合、TPSUCCESS が返されて auditcon の処理が続行します。
bankmgr.c
bankmgr
特に関心のあるイベントをサブスクライブするクライアント プログラム。
BTADD.ec
BTADD.c、BTADD.o、BTADD
データベースに支店および窓口を追加するための BR_ADD サービスと TLR_ADD サービスが定義されたファイル。
cracl.sh
-
アクセス制御のセキュリティ レベルを示すアクセス制御リスト (ACL) を生成するシェル スクリプト。
crqueue.sh
-
イベント通知に使用するアプリケーション キューを生成するシェル スクリプト。
crusers.sh
-
認証セキュリティ レベルで定義されるグループおよびユーザを生成するシェル スクリプト。
event.flds
-
イベント機能で使用されるフィールド テーブル ファイル。
FILES
-
bankapp のすべてのファイルを説明したファイル リスト。
README
-
Windows 2003 を除くすべてのプラットフォームでのインストールと起動の手順について説明したファイル。
README.nt
-
Windows 2003 プラットフォームでのインストールと起動の手順について説明したファイル。
README2
-
新機能を実現するための bankapp の拡張部分について説明したファイル。このファイルは、samples/atmi/bankapp ディレクトリにあります。
README2.nt
-
Windows 2003 プラットフォーム用の新機能を実現するための bankapp の拡張部分について説明したファイル。このファイルは、samples\atmi\bankapp ディレクトリにあります。
RUNME.cmd
 
Windows 2003 でアプリケーションをビルド、コンフィグレーション、起動、および停止するための対話型スクリプト。
RUNME.sh
-
UNIX でアプリケーションをビルド、コンフィグレーション、起動、および停止するための対話型スクリプト。
showq.sh!
-
メッセージ キューの状態と内容を出力するシェル スクリプト。
TLR.ec
TLR.c、TLR.o、TLR
WITHDRAWALDEPOSIT、および INQUIRY の 3 つのサービスがあります。
usrevtf.sh
-
Oracle Tuxedo サーバの TMUSREVTENVFILE を生成するシェル スクリプト。
XFER.c
XFER.o、XFER
TRANSFER サービスが定義されたファイル。
aud.v
aud.V、aud.h
audit クライアントと BAL サーバの間でやり取りされる構造体を定義する FML VIEW。
appinit.c
appinit.o
TLR を除くすべてのサーバを対象とする tpsvrinit() および tpsvrdone() のカスタマイズ バージョン。
audit.c
audit.o、audit
ABALTBALABAL_BID、および TBAL_BID サービスを使用して、銀行単位または支店単位で口座残高と窓口残高を取得するクライアント。
auditcon.c
auditcon
会話型モードで動作し、ABAL サービスTBAL サービス、ABALC_BID サービス、および TBALC_BID サービスを使用する対話型 audit プログラム。
bankapp.mk
-
UNIX 用のアプリケーションの makefile。
bankapp.nt
-
Windows 2003 用のアプリケーションの makefile。
bank.flds
bank.flds.h
サーバに使用される銀行データベース フィールドと FML 補助フィールドを含むフィールド テーブル ファイル。
bank.h
-
アプリケーション内の複数の C 言語プログラムに共通するデータ定義。
bankvar
-
bankapp の一部の環境変数が定義されたファイル。ほかの変数は ENVFILE で定義されています。ただし、ENVFILEbankvar を参照するので、アプリケーションのすべての環境変数は bankvar で定義できます。
crbank.sh
crbank
bankapp を SHM モードで実行した場合に、全銀行のデータベースを生成するシェル スクリプト。
crbankdb.sh
crbankdb
1 つのサーバ グループで使用されるデータベースを生成するシェル スクリプト。
crtlog.sh
crtlog、TLOG
マスタ サイトで UDLTLOG を生成し、非マスタ サイトで UDL を生成するシェル スクリプト。
driver.sh
driver
ud(1) を使用して、FML バッファを介してトランザクション要求を送り、アプリケーションの処理を行うシェル スクリプト。
envfile.sh
envfile、ENVFILE
tmloadcf で使用する ENVFILE を生成するシェル スクリプト。
gendata.c
gendata
ud で読み取り可能な要求を生成して、銀行を 10、窓口を 30、口座を 200 追加するシェル プログラム。
gentran.c
gentran
ud で読み取り可能なトランザクション要求を DEPOSITWITHDRAWALTRANSFER、および INQUIRY サービスから生成するプログラム。
populate.sh
populate
ud(1) を使用して、FML バッファに支店、窓口、および口座を追加する要求を格納し、それをデータベースに追加するシェル スクリプト。
ubbmp
TUXCONFIG
MP モードのコンフィグレーションで使用する UBBCONFIG のサンプル ファイル。
ubbshm
TUXCONFIG
SHM モードのコンフィグレーションで使用する UBBCONFIG のサンプル ファイル。
util.c
util.o
サービスで共通して使用される getstrl() などの関数。
bankclt.c
bankclt
bankapp のクライアント。

関連項目

 


bankapp クライアントの検証

bankclt.c ファイルとは

bankclt ファイルには、bankapp アプリケーションから Oracle Tuxedo サービスを要求するクライアント プログラムが定義されています。このクライアント プログラムはテキスト形式で、次のオプションが提供されています。

「アプリケーションの終了」を除く各オプションでは、次のタスクを実行するサブルーチンが呼び出されます。

  1. get_account()get_amount()get_socsec()get_phone()、および get_val() 関数を使用して、ユーザによるキーボードからの入力を取得します。
  2. グローバル FML バッファ (*fbfr) に値を追加します。関数によっては、ほかのフィールドを追加する場合もあります。これは、サーバで必要となる情報によって異なります。
  3. do_tpcall() 関数を使用して Oracle Tuxedo システムに要求を送信するルーチンが、必要なサービスを呼び出せるようにします。次の表は、関数とその関数によって呼び出されるサービスを示しています。
  4. 表 3-2 関数によって呼び出されるサービス
    関数名
    FML 入力フィールド
    FML 出力フィールド
    サービス名
    BALANCE()
    ACCOUNT_ID
    SBALANCE
    INQUIRY
    WITHDRAWAL()
    ACCOUNT_ID SAMOUNT
    SBALANCE
    WITHDRAWAL
    DEPOSIT()
    ACCOUNT_ID SAMOUNT
    SBALANCE
    DEPOSIT
    TRANSFER()
    ACCOUNT_ID (0)(注 1) ACCOUNT_ID (1)
    SAMOUNT
    SBALANCE (0)
    SBALANCE (1)
    TRANSFER
    OPEN_ACCT()
    LAST_NAME FIRST_NAME MID_INIT
    SSN
    ADDRESS
    PHONE
    ACCT_TYPE BRANCH_ID SAMOUNT
    ACCOUNT_ID SBALANCE
    OPEN_ACCT
    CLOSE_ACCT()
    ACCOUNT_ID
    SBALANCE
    CLOSE_ACCT

注 1かっこ内の数値は、そのフィールドでの FML オカレンスの数です。

  1. 処理が正常に完了すると、各関数は返された FML バッファから必要なフィールドを取得し、その結果を出力します。

以下は、do_tpcall() 関数 (bankclt.c の 447 行目以降) のサンプル コードです。

コード リスト 3-1 bankclt.c での do_tpcall() 関数のサンプル コード
/*
* この関数は 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);
}

do_tpcall() 関数は、次のタスクを実行します。

注意 : unsolfcn() 関数は、クライアントへの非請求メッセージがある場合に呼び出されます。この関数では、STRING 型バッファだけを使用でき、メッセージが出力されます。

bankapp での ud(1) の使い方

bankapp では、Oracle Tuxedo プログラム ud(1) が使用されます。ud(1) は、標準入力からフィールド化バッファを読み取り、それをサービスに送信します。サンプル アプリケーションでは、ud は populate および driver プログラムで使用されています。

要求/応答クライアント : audit.c

audit は、ABALTBALABAL_BID、および TBAL_BID サービスを使用して、銀行単位または支店単位で残高照会を行う要求/応答型のクライアント プログラムです。このプログラムは、次の 2 とおりの方法で実行できます。

audit のソース コードは、main() および sum_bal() サブルーチンから構成されます。Oracle Tuxedo の ATMI 関数は、この両方で使用されます。このプログラムでは、VIEW 型バッファと aud.h ヘッダ ファイルで定義された構造体が使用されます。構造体のソース コードは、VIEW 記述ファイル aud.v に記述されています。

次の擬似コードは、このプログラムのアルゴリズムを示しています。

コード リスト 3-2 audit の擬似コード
     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() で行われる処理をまとめたものです。

main() 関数では、次の処理が行われます。

  1. /* アプリケーションへの参加 */
  2. /* グローバル トランザクションの開始 */
  3. /* バッファの作成、およびデータ ポインタの設定 */
  4. /* tpcall の実行 */
  5. /* グローバル トランザクションのコミット */
  6. /* アプリケーションからの分離 */

sum_bal サブルーチンでは、次の処理が行われます。

  1. /* バッファの作成、およびデータ ポインタの設定 */
  2. /* tpacall の実行 */
  3. /* tpgetrply を使用した応答の検索 */

会話型クライアント : auditcon.c

auditcon は、audit プログラムの会話型バージョンです。auditcon のソース コードでは、会話型通信のための ATMI 関数が使用されます。たとえば、クライアントとサーバ間の接続を確立する tpconnect()、メッセージを送信する tpsend()、メッセージを受信する tprecv() が使用されます。

次の擬似コードは、このプログラムのアルゴリズムを示しています。

コード リスト 3-3 auditcon の擬似コード
    main()
{
            アプリケーションに参加
トランザクションを開始
会話型サービス AUDITC への接続を開く
ユーザが終了するまで繰り返す: {
ユーザに入力を促す
サービス要求を送信
応答を受信
応答をユーザ端末に出力
次の入力を促す
}
            トランザクションをコミット
アプリケーションを終了
}

イベントをモニタするクライアント : bankmgr.c

bankmgr は、bankapp の継続的に稼働するクライアントです。このプログラムは、新規口座の開設や 10,000 ドル以上の引き出しなど、アプリケーション定義のイベントで特に関心のあるものをサブスクライブします。bankmgr.c クライアントの詳細については、bankappREADME2 ファイル、または bankmgr.c コードを参照してください。

関連項目

 


bankapp サーバと bankapp サービスの検証

ここでは、次の内容について説明します。

サーバとは、1 つ以上のサービスを提供する実行可能プロセスです。Oracle Tuxedo システムでは、サーバはクライアントとして動作するプロセスから継続的に要求を受け取り、それを適切なサービスにディスパッチします。サービスとは、アプリケーションの処理を行うために記述された C 言語のサブルーチンです。Oracle Tuxedo アプリケーションは、サービスを提供し、リソース マネージャにアクセスできるように作成されています。サービス ルーチンは、Oracle Tuxedo アプリケーション プログラマが作成します。

データベースと直接やり取りは行わない TRANSFER サービスを除くすべての bankapp サービスのコードは、C 言語に埋め込み型 SQL 文が使用されています。TRANSFER サービスは、XFER サーバによって実行される C 言語プログラムです。つまり、ソース ファイルは .ec ファイルではなく .c ファイルです。

bankapp のすべての bankapp サービスでは、ATMI で提供される関数を使用して、次の処理が行われます。

bankapp の要求/応答型サーバ

bankapp の 5 つのサーバは、応答/要求モードで動作します。このうちの 4 つは、埋め込み型 SQL 文を使用して、リソース マネージャにアクセスします。これらのサーバのソース ファイル (bankapp サンプル アプリケーションのサブディレクトリにあります) には、ファイル名に拡張子として .ec が付いています。

5 番目のサーバ XFER は振り替えに使用されるサーバで、リソース マネージャ自体への呼び出しは行いません。このサーバは、TLR サーバによって提供される WITHDRAWAL サービスおよび DEPOSIT サービスを呼び出し、口座間の振り替えを行います。XFER では、リソース マネージャへの呼び出しは行われず、埋め込み型 SQL 文が使用されていないので、XFER のソース ファイルは .c ファイルです。

サーバ名
提供される機能
BTADD.ec
支店および窓口の記録を任意のサイトから適切なデータベースに追加します。
ACCT.ec
主な顧客サービスである口座の開設および解約 (OPEN_ACCT および CLOSE_ACCT) を行います。
TLR.ec
窓口サービスである WITHDRAWALDEPOSIT、および INQUIRY を実行します。TLR プロセスでは、サーバのコマンドラインに指定された -T オプションによって、そのプロセスが TELLER ファイル内の実際の窓口であることが認識されます。
XFER.c
データベースの任意の口座間で振り替えを行います。
BAL.ec
データベースのすべての支店または特定の支店の口座残高を計算します。

bankapp 会話型サーバ

AUDITC は、会話型サーバの一例です。このサーバでは、AUDITC と呼ばれるサービスが提供されます。会話型クライアント auditcon は、AUDITC への接続を確立し、そこに監査情報を要求します。

AUDITC は要求を評価し、必要な情報を得るために適切なサービス (ABALTBALABAL_BID、または TBAL_BID) を呼び出します。呼び出されたサービスから応答を受信すると、AUDITC はその応答を auditcon に返します。会話型サーバのサービスは、要求/応答サービスを呼び出すことができます。別の会話型サーバとの接続を確立することもできますが、この機能は AUDITC では提供されていません。

bankapp サービス

bankapp では、12 種類の要求/応答サービスが提供されます。bankapp の各サービス名は、サーバのソース コード内にある C 言語の関数名と一致します。

bankapp サービス
サービスを提供するサーバ
入力
処理内容
BR_ADD
BTADD
FML バッファ
  • 新規支店レコードを追加します。
TLR_ADD
BTADD
FML バッファ
  • 新規窓口レコードを追加します。
OPEN_ACCT
ACCT
FML バッファ
  • ACCOUNT ファイルにレコードを挿入し、DEPOSIT を呼び出して開設時の預け入れ額を加算します。
  • 開設を行った窓口の BRANCH_ID に基づき、新しい口座用の ACCOUNT_ID を選択します。
CLOSE_ACCT
ACCT
FML バッファ
  • ACCOUNT レコードを削除します。
  • ACCOUNT_ID を確認します。
  • WITHDRAWAL を呼び出し、解約時の残高を削除します。
WITHDRAWAL
TLR
FML バッファ
  • 指定された支店、窓口、口座の残高から引き出し金額を減算します。
  • ACCOUNT_ID および SAMOUNT フィールドを確認します。
  • 口座および窓口から預金が引き出し可能であることを確認します。
DEPOSIT
TLR
FML バッファ
  • 指定された支店、窓口、口座の残高に預け入れ額を加算します。
  • ACCOUNT_ID および SAMOUNT フィールドを確認します。
INQUIRY
TLR
FML バッファ
  • 口座残高を取得します。
  • ACCOUNT_ID を確認します。
TRANSFER
XFER
FML バッファ
  • tpcall() を呼び出して WITHDRAWAL サービスを要求し、再度 tpcall() を呼び出して DEPOSIT サービスを要求します。
ABAL
BAL
aud.v の VIEW バッファ
  • 特定のサイトにおける全支店の口座残高を計算します。
TBAL
BAL
入力としての aud.v の VIEW バッファ
  • 特定のサイトにおける全支店の窓口残高を計算します。
ABAL_BID
BAL
入力としての aud.v の VIEW バッファ
  • 特定の BRANCH_ID の窓口残高を計算します。
TBAL_BID
BAL
入力としての aud.v の VIEW バッファ
  • 特定の BRANCH_ID の窓口残高を計算します。

bankapp サービスのアルゴリズム

次の擬似コードは、bankapp の各サービスで使用されるアルゴリズムを示しています。サービスには、BR_ADDTLR_ADDOPEN_ACCTCLOSE_ACCTWITHDRAWALDEPOSITINQUIRYTRANSFERABALTBALABAL_BID、および TBAL_BID があります。このサンプル コードを参考にすると、bankapp サーバのソース コードを理解しやすくなります。

コード リスト 3-4 BR_ADD の擬似コード
    void BR_ADD (TPSVCINFO *transb)
{
TPSVCINFO データ バッファへのポインタを設定;
フィールド化バッファからサービス要求に関連するすべての値を取得;
BRANCH にレコードを挿入;
tpreturn() で成功を示す値を返す;
}
コード リスト 3-5 TLR_ADD の擬似コード
    void TLR_ADD (TPSVCINFO *transb)
{
TPSVCINFO データ バッファへのポインタを設定;
フィールド化バッファからサービス要求に関連するすべての値を取得;
支店の LAST_ACCT を読み取り TELLER_ID を取得;
窓口レコードの挿入;
新たな LAST_TELLER で BRANCH を更新;
tpreturn() で成功を示す値を返す;
}
コード リスト 3-6 OPEN_ACCT の擬似コード
    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() で成功を示す値を返す;
}
コード リスト 3-7 CLOSE_ACCT の擬似コード
    void CLOSE_ACCT(TPSVCINFO *transb)
{
Fvall() でフィールド化バッファから口座番号を抽出;
口座番号が妥当であるか確認し、妥当でなければ tpreturn() で
エラーを示す値を返す;
トランザクション整合性レベルを、読み取り/書き込みに設定;
最終的な引き出し金額の確認のため、ACCOUNT レコードを検索;
tpalloc() を使用して引き出し要求バッファを割り当て、Finit() で初期化し
FML タイプとして使用;
WITHDRAWAL サービス要求への値を引き出しバッファに格納;
サービスからの呼び出しにより WITHDRAWAL 要求の
優先順位を上げる;
tpcall() で WITHDRAWAL サービスを呼び出し、口座残高を引き出す;
ACCOUNT レコードを削除;
必要な情報を含む応答バッファを用意;
tpfree() で引き出し要求バッファを解放;
tpreturn() で、成功を示す値を返す;
}
コード リスト 3-8 WITHDRAWAL の擬似コード
    void WITHDRAWAL(TPSVCINFO *transb)
{
Fvall() および Fget() で、フィールド化バッファから口座番号と金額を抽出;
口座番号が妥当であるか確認し、妥当でなければ tpreturn() でエラーを示す値を返す;
引き出し金額が正の値であるか確認し、正でなければ tpreturn() で
エラーを示す値を返す;
トランザクション整合性レベルを、読み取り/書き込みに設定;
口座残高を取得するため、 ACCOUNT レコードを検索;
引き出し金額が ACCOUNT で示される残高を超えないか確認;
窓口残高と支店番号を取得するため、TELLER レコードを検索;
引き出し金額が TELLER の残高を超えないか確認;
支店残高を取得するため、BRANCH レコードを検索;
引き出し金額が BRANCH の残高を超えないか確認;
引き出し金額を減算し、新たな口座残高を決定;
新たな口座残高で ACCOUNT レコードを更新;
引き出し金額を減算し、新たな窓口残高を決定;
新たな窓口残高で TELLER レコードを更新;
引き出し金額を減算し、新たな支店残高を決定;
新たな支店残高で BRANCH レコードを更新;
トランザクション情報と共に、新たな HISTORY レコードを挿入;
必要な情報を含む応答バッファを用意;
tpreturn() で、成功を示す値を返す;
}
コード リスト 3-9 DEPOSIT の擬似コード
    void DEPOSIT(TPSVCINFO *transb)
{
Fvall() および Fget() で、フィールド化バッファから口座番号と金額を抽出;
口座番号が妥当であるか確認し、妥当でなければ tpreturn() でエラーを示す値を返す;
預け入れ金額が正の値であるか確認し、正でなければ tpreturn() で
エラーを示す値を返す;
トランザクション整合性レベルを、読み取り/書き込みに設定;
口座残高を取得するため、ACCOUNT レコードを検索;
窓口残高と支店番号を取得するため、TELLER レコードを検索;
支店残高を取得するため、BRANCH レコードを検索;
預け入れ金額を加算し、新たな口座残高を決定;
新たな口座残高で ACCOUNT レコードを更新;
預け入れ金額を加算し、新たな窓口残高を決定;
新たな窓口残高で TELLER レコードを更新;
預け入れ金額を加算し、新たな支店残高を決定;
新たな支店残高で BRANCH レコードを更新;
トランザクション情報と共に、新たな HISTORY レコードを挿入;
必要な情報を含む応答バッファを用意;
tpreturn() で成功を示す値を返す;
}
コード リスト 3-10 INQUIRY の擬似コード
    void INQUIRY(TPSVCINFO *transb)
{
Fvall() でフィールド化バッファから口座番号を抽出;
口座番号が妥当であるか確認し、妥当でなければ tpreturn() でエラーを示す値を返す;
トランザクション整合性レベルを、読み取りのみに設定;
口座残高を取得するため、ACCOUNT レコードを検索;
必要な情報を含む応答バッファを用意;
tpreturn() で成功を示す値を返す;
}
コード リスト 3-11 TRANSFER の擬似コード
    void TRANSFER(TPSVCINFO *transb)
{
Fvall() および Fget() で、フィールド化バッファから、口座番号と
金額を抽出;
口座番号が両方とも妥当であるか確認し、妥当でない場合は、tpreturn() で
エラーを示す値を返す;
振り替え金額が正の値であるか確認し、正でない場合は tpreturn() で
エラーを示す値を返す;
tpalloc() を使用して引き出し要求バッファを割り当て、
Finit() で初期化し
FML タイプとして使用;
WITHDRAWAL サービス要求への値を引き出し要求バッファに格納;
サービスからの呼び出しにより WITHDRAWAL 要求の
優先順位を上げる;
tpcall() で WITHDRAWAL サービスを呼び出す;
応答要求バッファから情報を取得;
預け入れ要求バッファとして使用するため、引き出し要求バッファを Finit() により
再度初期化;
DEPOSIT サービス要求への値を預け入れ要求のバッファに格納;
DEPOSIT 要求の優先順位を上げる;
tpcall() で DEPOSIT サービスを呼び出す;
必要な情報を含む応答バッファを用意;
tpfree() で引き出し/預け入れ要求バッファを解放;
tpreturn() で成功を示す値を返す;
}
コード リスト 3-12 ABAL の擬似コード
    void ABAL(TPSVCINFO *transb)
{
トランザクション整合性レベルを、読み取りのみに設定;
ABAL サーバ グループのデータベースで、ACCOUNT ファイルの
すべての BALANCE 値の合計を検索
(単一の ESQL 文で十分);
合計を応答バッファ データ構造体へ格納;
tpreturn() で成功を示す値を返す;
}
コード リスト 3-13 TBAL の擬似コード
    void TBAL(TPSVCINFO *transb)
{
トランザクション整合性レベルを、読み取りのみに設定;
TBAL サーバ グループのデータベースで、TELLER ファイルの
すべての BALANCE 値の合計を検索
(単一の ESQL 文で十分);
合計を応答バッファ データ構造体へ格納;
tpreturn() で成功を示す値を返す;
}
コード リスト 3-14 ABAL_BID の擬似コード
    void ABAL_BID(TPSVCINFO *transb)
{
トランザクション整合性レベルを、読み取りのみに設定;
transb バッファに基づき、branch_ID を設定;
BRANCH_ID = branch_ID に該当するレコードの中で、ACCOUNT ファイルの
すべての BALANCE 値の合計を検索
(単一の ESQL 文で十分);
合計を応答バッファ データ構造体へ格納;
tpreturn() で成功を示す値を返す;
}
コード リスト 3-15 TBAL_BID の擬似コード
    void TBAL_BID(TPSVCINFO *transb)
{
トランザクション整合性レベルを、読み取りのみに設定;
transb バッファに基づき、branch_ID を設定;
BRANCH_ID = branch_ID に該当するレコードの中で、TELLER ファイルの
すべての BALANCE 値の合計を検索
(単一の ESQL 文で十分);
合計を応答バッファ データ構造体へ格納;
tpreturn() で成功を示す値を返す;
}

サーバに組み込みのユーティリティ

bankapp のソース ファイルには、appinit.cutil.c という 2 つの C 言語サブルーチン ファイルがあります。

サービスをコーディングする別の方法

bankapp のソース ファイルでは、すべてのサービスがサーバのソース コードとして参照されるファイルに組み込まれています。これらのファイルは bankapp サーバと名前が同じですが、main() 関数が含まれていないので実際にはサーバではありません。標準 main() は、buildserver コマンドの実行時に Oracle Tuxedo ATMI によって提供されます。

Oracle Tuxedo システム アプリケーションを作成する別の方法として、各サービス サブルーチンを別のファイルに記述する方法があります。この方法を使用して、TLR サーバを作成するとします。TLR.ec ファイルには 3 つのサービスが定義されています。次の手順に従って、これらのサービスを INQUIRY.ecWITHDRAW.ec、および DEPOSIT.ec の 3 つの .ec ファイルに分けます。以下の手順に従います。

  1. 各 .ec ファイルを .o ファイルにコンパイルします。
  2. 各 .o ファイルに -f オプションを指定して、buildserver コマンドを実行します。
  3.     buildserver -r TUXEDO/SQL \
    -s DEPOSIT -s WITHDRAWAL -s INQUIRY \
    -o TLR \
    -f DEPOSIT.o -f WITHDRAW.o -f INQUIRY.o \
    -f util.o -f -lm
    注意 : 上記のコマンドラインの円マークは、改行を明示的に示すために表記されているだけです。コマンドとオプションは 1 行に入力できます。

この例に示したように、すべてのサービス関数を 1 つのソース ファイルに記述する必要はありません。つまり、サーバはソース プログラム ファイルとして存在する必要はありません。サーバは、各種のソース ファイルを使用して、buildserver コマンドラインに指定されたファイルに基づいて 1 つの実行可能サーバとしてビルドできます。この方法により、サーバを柔軟にビルドできるようになります。

関連項目

 


bankapp のファイルおよびリソースの準備

ここでは、bankapp の実行に必要なファイルとリソースを作成するための手順を順に示します。

各作業をクリックすると、その作業を行う手順が表示されます。

 


ステップ 1 : 環境変数の設定

環境変数は、bankvar ファイルに定義されています。このファイルは数多くのコメントが記述された大きな (約 185 行から構成される) ファイルです。

  1. テキスト エディタで、bankvar ファイルの内容を確認します。
    • コメントではない最初のコード行では、TUXDIR が設定されているかどうかが確認されます。設定されていない場合、ファイルの実行が失敗して、次のメッセージが表示されます。
    • TUXDIR: パラメータが null か、設定されていません。
  2. TUXDIR パラメータに Oracle Tuxedo システムのディレクトリ構造でのルート ディレクトリを設定し、エクスポートします。
  3. bankvar の別のコード行で、APPDIR${TUXDIR}/samples/atmi/bankapp が設定されています。これは、bankapp ソース ファイルが置かれたディレクトリです。APPDIR は、Oracle Tuxedo システムによって、アプリケーション固有のファイルが検索されるディレクトリです。オリジナルのソース ファイルを上書きしないように、bankapp ファイルを別のディレクトリにコピーします。その場合は、そのディレクトリを APPDIR に指定します。TUXDIR の下位ディレクトリである必要はありません。
  4. DIPCKEY に値を設定します。これは、Oracle Tuxedo システム データベースの IPCKEY です。DIPCKEY の値は、UBBCONFIG ファイルで指定された Oracle Tuxedo システムの IPCKEY とは異なる値を指定する必要があります。
  5. 注意 : bankvar で指定されるほかの変数は、サンプル アプリケーションで各種の働きをします。独自のアプリケーションを開発する場合は、それらの働きについて認識しておくことが必要です。bankvar にはすべての変数が定義されているので、後で実際のアプリケーションのテンプレートとして使用できます。
  6. bankvar に必要な変更を加えたら、次のように bankvar を実行します。
  7. . ./bankvar
    コード リスト 3-16 bankvar: bankapp の環境変数
    # 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

関連項目

 


ステップ 2 : bankapp でのサーバのビルド

buildserver(1) コマンドを使用して、Oracle Tuxedo システムの ATMI main() 関数で実行可能 ATMI サーバを作成します。このコマンドではオプションを使用して、出力ファイル、アプリケーションで提供される入力ファイル、各種の方法で Oracle Tuxedo システム アプリケーションを実行するためのライブラリを指定します。

buildserver は、cc コマンドを呼び出します。環境変数の CC を設定すると別のコンパイル コマンドを指定でき、CFLAGS を設定するとコンパイル時と編集時にフラグを設定できます。buildserver コマンドは bankapp.mk で使用され、銀行業務アプリケーションの各サーバをコンパイルしてビルドします。以下に、bankapp の 6 種類のサーバについて説明します。

ACCT サーバのビルド

ACCT サーバは、OPEN_ACCT および CLOSE_ACCT 関数のコードが記述された ACCT.ec ファイルから生成されます。このサーバをビルドするには、ACCT.ec をコンパイルして ACCT.o ファイルを生成し、それを buildserver コマンドに渡します。この方法では、コンパイル エラーを特定でき、サーバをビルドする前に修正することができます。

  1. ACCT.o ファイルを作成します (bankapp.mk で作成されます)。
    • esql ACCT.ec と指定して、.c ファイルを生成します。
    • cc -I $TUXDIR/include -c ACCT.c と指定して、.o ファイルを生成します。
    • 次の buildserver コマンドを指定して、ACCT サーバを作成します。
    •     buildserver -r TUXEDO/SQL \
      -s OPEN_ACCT -s CLOSE_ACCT \
      -o ACCT \
      -f ACCT.o -f appinit.o -f util.o
      注意 : 上記のコマンドラインの円マークは、改行を明示的に示すために表記されているだけです。コマンドとオプションは 1 行に入力できます。

以下は、buildserver コマンドラインで指定されている各オプションの説明です。

以下に、ACCT サーバを作成するために、buildserver コマンドラインに指定されたオプションで行われる操作を簡単にまとめます。

BAL サーバのビルド

BAL サーバは、ABALTBALABAL_BID、および TBAL_BID 関数のコードが記述された BAL.ec ファイルから生成されます。ACCT.ec ファイルと同様に、BAL.ec をコンパイルして BAL.o ファイルを生成し、それを buildserver コマンドに渡します。そのため、コンパイル エラーを特定でき、サーバをビルドする前に修正することができます。

  1. 次のように、buildserver コマンドで BAL サーバをビルドします。
  2.     buildserver -r TUXEDO/SQL \
    -s ABAL -s TBAL -s ABAL_BID -s TBAL_BID\
    -o BAL \
    -f BAL.o -f appinit.o
    注意 : 上記のコマンドラインの円マークは、改行を明示的に示すために表記されているだけです。コマンドとオプションは 1 行に入力できます。
    • -r オプションは、Oracle Tuxedo システム SQL リソース マネージャを指定します。
    • -s オプションは、BAL サーバを構成するサービスとして、ABALTBALABAL_BIDTBAL_BID を指定します。これらのサービス名は、そのサービスを定義する BAL.ec ファイルの関数名と同じです。
    • -o オプションは、実行可能サーバに BAL という名前を指定します。
    • -f オプションは、BAL.oappinit.o ファイルがリンク時と編集時に使用されることを指定します。

BTADD サーバのビルド

BTADD サーバは、BR_ADD および TLR_ADD 関数のコードが記述された BTADD.ec ファイルから生成されます。BTADD.ec をコンパイルして BTADD.o ファイルを生成し、それを buildserver コマンドに渡します。

  1. 次のように、buildserver コマンドで BTADD サーバをビルドします。
  2.     buildserver -r TUXEDO/SQL \
    -s BR_ADD -s TLR_ADD \
    -o BTADD \
    -f BTADD.o -f appinit.o
    注意 : 上記のコマンドラインの円マークは、改行を明示的に示すために表記されているだけです。コマンドとオプションは 1 行に入力できます。
    • -r オプションは、Oracle Tuxedo システム SQL リソース マネージャを指定します。
    • -s オプションは、BTADD を構成するサービスとして、BR_ADDTLR_ADD を指定します。これらのサービス名は、そのサービスを定義する BTADD.ec ファイルの関数名と同じです。
    • -o オプションは、実行可能サーバに BTADD という名前を指定します。
    • -f オプションは、BTADD.oappinit.o ファイルがリンク時と編集時に使用されることを指定します。

TLR サーバのビルド

TLR サーバは、DEPOSITWITHDRAWAL、および INQUIRY 関数のコードが記述された TLR.ec ファイルから生成されます。TLR.ec をコンパイルして TLR.o ファイルを生成し、それを buildserver コマンドに渡します。

  1. 次のように、buildserver コマンドで TLR サーバをビルドします。
  2.     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 サーバを構成するサービスとして、DEPOSITWITHDRAWAL、および INQUIRY を指定します。これらのサービス名は、そのサービスを定義する TLR.ec ファイルの関数名と同じです。
    • -o オプションは、実行可能サーバに TLR という名前を指定します。
    • -f オプションは、TLR.outil.o ファイルがリンク時と編集時に使用されることを指定します。
    • 注意 : 上記のサンプル コードでは、-f を使用して、オプション (-lm) を cc コマンドに渡しています。このコマンドは、buildserver によって呼び出されます。-f-lm の引数を指定すると、コンパイル時に math ライブラリがリンクされます。

コンパイル時に使用できるオプションについては、『UNIX System V User's Reference Manual』の cc(1) を参照してください。

XFER サーバのビルド

XFER サーバは、TRANSFER 関数のコードが記述された XFER.c ファイルから生成されます。XFER.c をコンパイルして XFER.o ファイルを生成し、それを buildserver コマンドに渡します。

  1. 次のように、buildserver コマンドで XFER サーバをビルドします。
  2.     buildserver -r TUXEDO/SQL \
    -s TRANSFER \
    -o XFER \
    -f XFER.o -f appinit.o
    注意 : 上記のコマンドラインの円マークは、改行を明示的に示すために表記されているだけです。コマンドとオプションは 1 行に入力できます。
    • -r オプションは、Oracle Tuxedo システム SQL リソース マネージャを指定します。
    • -s オプションを使用して、XFER サーバを構成するサービスとして TRANSFER を指定します。このサービス名は、TRANSFER サービスを定義する XFER.c ファイルの関数名と同じです。
    • -o オプションを使用して、実行可能サーバに XFER という名前を指定します。
    • -f オプションを使用して、XFER.oappinit.o ファイルがリンク時と編集時に使用されることを指定します。

bankapp.mk ファイルでビルドされるサーバ

bankapp サーバをビルドする場合、buildserver コマンドの指定方法を理解していることが大切です。ただし、実際にビルドする場合、makefile にビルドの定義を記述することがよくあります。bankapp でもその方法が採用されています。

 


ステップ 3 : bankapp Makefile の編集

bankapp には、すべてのスクリプトを実行可能にし、VIEW 記述ファイルをバイナリ形式に変換し、アプリケーション サーバの作成に必要なすべてのプリコンパイル、コンパイル、およびビルドを行う makefile が提供されています。また、最初からやり直す場合にもこのファイルを利用できます。

提供されている bankapp.mk をそのまま使わずにフィールドを編集した方がよい場合があります。また、説明が必要なフィールドもあります。以下にそれらのフィールドについて説明します。

TUXDIR パラメータの編集

  1. bankapp.mk ファイルの 40 行目前後に、次のコメントと TUXDIR パラメータが記述されています。
  2.     #
    # Tuxedo システムのルート ディレクトリです。このファイルは、編集してこの値を正しく設定するか、
    # または "make -f bankapp.mk TUXDIR=/correct/tuxdir" を使用して正しい値を渡します。
    # そのようにしないと、bankapp のビルドは失敗します。
    #
    TUXDIR=../..
  3. TUXDIR パラメータに、Oracle Tuxedo システムがインストールされたルート ディレクトリの絶対パス名を指定します。

APPDIR パラメータの編集

  1. APPDIR パラメータに設定された値を確認します。bankapp の場合、APPDIR には bankapp ファイルが置かれたディレクトリ (TUXDIR の相対パス) が指定されています。次に示す bankapp.mk のセクションには、APPDIR の設定についての説明と定義が記述されています。
  2.     #
    # bankapp アプリケーションのソース コードと実行可能ファイルが置かれたディレクトリです。
    # このファイルは、編集してこの値を正しく設定するか、
    # または "make -f bankapp.mk APPDIR=/correct/appdir" を使用して正しい値を渡します。
    # そのようにしないと、bankapp のビルドは失敗します。
    #
    APPDIR=$(TUXDIR)/samples/atmi/bankapp
    #
  3. README ファイルに従って、別のディレクトリにファイルをコピーした場合、APPDIR にはファイルのコピー先のディレクトリを指定します。makefile を実行すると、そのディレクトリにアプリケーションがビルドされます。

リソース マネージャのパラメータの設定

デフォルトでは、bankapp はデータベース リソース マネージャとして Oracle Tuxedo/SQL を使用するように設定されています。その場合、ご使用のシステムに Oracle Tuxedo システム データベースがインストールされていることが必要です。インストールされていない場合は、RM パラメータに TUXDIR/udataobj/RM にリストされているリソース マネージャの名前を設定します。

    #
# リソース マネージャ
#
RM=TUXEDO/SQL
#
注意 : Oracle Tuxedo SQL リソース マネージャは、デモ用のプログラムです。

bankapp.mk ファイルの実行

  1. bankapp.mk に必要な変更を加えたら、次のコマンドラインを入力して実行します。
  2.     nohup make -f bankapp.mk &
  3. nohup.out ファイルを調べて、処理が正しく行われたことを確認します。
  4. 注意 : bankvar には、bankapp.mk の実行時に参照されるパラメータが設定されています。

関連項目

 


ステップ 4 : bankapp データベースの作成

ここでは、bankapp とリソース マネージャ (通常はデータベース管理システム) 間のインタフェース、および bankapp データベースを作成する方法について説明します。bankapp では、Oracle Tuxedo システム データベース、つまり XA 準拠のリソース マネージャの Oracle Tuxedo/SQL の機能が使用されます。

注意 : Oracle Tuxedo SQL リソース マネージャは、デモ用のプログラムです。

bankapp データベースを作成する方法は、単一プロセッサでアプリケーションを起動するか (SHM モード)、複数のプロセッサをネットワーク上で起動するか (MP モード) によって異なります。

SHM モードでのデータベースの作成

  1. 次のコマンドを入力して、環境変数を設定します。
  2.     . ./bankvar
  3. crbank を実行します。crbankcrbankdb を 3 回呼び出し、そのたびに環境変数が変更されます。そのため、1 つのマシンで 3 つの異なるデータベース ファイルが作成されます。つまり、ネットワーク接続されていない場合でも、複数のマシンから構成される Oracle Tuxedo システム環境をシミュレートできます。

MP モードでのデータベースの作成

  1. 次のコマンドを入力して、環境変数を設定します。
  2.     . ./bankvar
    注意 : 既に環境変数が設定されている場合もあります。詳細については、「環境変数の設定」を参照してください。
  3. crbankdb を実行して、このサイトのデータベースを作成します。
  4. Oracle Tuxedo システムのネットワークに追加した各マシンで、bankvar を編集して FSCONFIG 変数のパス名を指定します。このパス名は、そのサイトで使用され、コンフィグレーション ファイル ubbmp で参照される変数です。手順 1 と 2 を繰り返します。

関連項目

 


ステップ 5 : XA 準拠のリソース マネージャの準備

XA 準拠の代替リソース マネージャで bankapp を実行するには、各種のファイルを変更する必要があります。ここでは、次の内容について説明します。

bankvar ファイルの変更

  1. Oracle Tuxedo システム データベースを作成する環境変数を確認します。これらの環境変数には、次のデフォルト値が設定されています。
  2.     BLKSIZE=512
    DBNAME=bankdb
    DBPRIVATE=no
    DIPCKEY=80953
    FSCONFIG=${APPDIR}/bankdl1
    注意 : これらの環境変数は、Oracle Tuxedo システムだけを対象としています。ほかのデータベース管理システムを使用する場合は、必要に応じてほかの環境変数を設定してください。
  3. 必要に応じてこれらの変数を変更して、リソース マネージャのデータベースを作成します。

bankapp サービスの変更

bankapp では、データベースへのすべてのアクセスは埋め込み型 SQL 文で実行されます。そのため、新しいリソース マネージャで SQL がサポートされている場合は問題がありません。appinit.c ユーティリティには、tpopen()tpclose() への呼び出しが定義されています。

bankapp.mk ファイルの変更

  1. bankapp.mk の RM パラメータを編集し、新しいリソース マネージャの名前を指定します。
  2. RM ファイルに次のエントリがあることを確認します。
  3. $TUXDIR/udataobj/RM
  4. 必要に応じて、SQL コンパイラ名とそのオプションを変更します。ソース ファイル名に拡張子 .ec が使用されていない場合があります。生成される .c ファイルをコンパイルするには、デフォルトではない名前を設定することが必要な場合もあります。

crbank および crbankdb の変更

  1. crbank が代替リソース マネージャで処理されないことがあります。crbank は、変数をリセットして、crbankdb を 3 回実行するだけです。
  2. crbankdb を使用する場合は注意します。次のコード リストは、crbankdb スクリプトの最初の部分です。このサンプル コードの後に、Oracle Tuxedo システム以外のリソース マネージャでは機能しないコード部分について説明してあります。
  3. コード リスト 3-17 crbankdb スクリプト
        #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 行を参照すると、変更が必要な部分と不要な部分を判断できます。コードからわかるように、crbankdbdbadmin への入力と sql シェルコマンドへの入力から構成されています。最初の here ファイルは、Oracle Tuxedo システムのコマンド dbadmin に渡されて、データベースのデバイス リストが作成されます。

このコマンドは、Oracle Tuxedo リソース マネージャだけで機能します。テーブル スペースを作成したり、適切な特権を認めるために、ほかのコマンドが必要になる場合があります。

コンフィグレーション ファイルの変更

GROUPS セクションで、TMSNAME および OPENINFO パラメータに適切な値 (つまり、リソース マネージャで認識される値) を指定します。

 


Windows 2003 プラットフォーム上での bankapp と Oracle (XA 準拠の RM) の統合

  1. nt\bankvar.cmd を編集し、次の環境変数に適切な値を指定します。
  2. 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%;
  3. スクリプトを実行して、環境変数を設定します。
  4. >bankvar
  5. 次のように、TUXDIR\udataobj\RM ファイルを編集します。
    • $TUXDIR\udataobj\RM ファイルに次の行を追加します。
    • Oracle_XA;xaosw;%ORACLE_HOME%\pro80\lib\msvc\sqllib80.lib %ORACLE_HOME%\RDBMS80\XA\xa80.lib

      Oracle がネットワーク上にある場合は、次のように編集します。

    • マシンをドライブ (たとえば F ドライブ) にマップします。
    • $TUXDIR\udataobj\RM ファイルに次の行を追加します。
    • Oracle_XA;xaosw;f:\orant\pro80\lib\msvc\sqllib80.lib f:\orant\RDBMS80\XA\xa80.lib
    • RM ファイルで、Oracle_XA の以前のエントリを削除します。
  6. Oracle8 のトランザクション マネージャ サーバをビルドします。
  7. cd $APPDIR
    buildtms -r Oracle_XA -o TMS_ORA
  8. 次の表に従って、nt\bankapp.mak ファイルを編集します。
  9. 作業
    次の環境変数を指定します。
    TUXDIR=Oracle Tuxedo システムのインストール先のルート ディレクトリ
     
    APPDIR=bankapp ファイルが置かれたアプリケーション ディレクトリ
     
    RM=Oracle_XA
     
    ORACLE_LIBS=$(ORACLE_HOME) \PRO80\LIB
     
    RMNAME=Oracle_XA
     
    SQLPUBLIC=$(ORACLE_HOME)\PRO80\C\INCLUDE
     
    CFLAGS=$(HOST) -DNOWHAT=1 $(CGFLAGS) $(DFML32)
     
    CGFLAGS=-DWIN32 -W3 -MD -nologo
     
    ORACLE_DIR=$(ORACLE_HOME)\bin
     
    INCDIR=$(TUXDIR)\include
     
    CC=cl
    .ec.c セクションで、埋め込み型の SQL プログラムから C プログラムを作成する場合の規則を編集し、proc コンパイラを使用して次の値を設定します。
    set TUXDIR=$(TUXDIR) & $(ORACLE_DIR)\proc80 mode=ansi release_cursor=yes
    include=$(SQLPUBLIC) include=$(INCDIR) $(SQL_PLATFORM_INC) -c iname=$*.ec
    .c.obj セクションで、C プログラムからオブジェクト ファイルを作成する場合の規則を編集し、次の値を設定します。
    $(CC) -c $(CFLAGS) $(SQLPUBLIC) $(INCLUDE) $*.c

  10. *.ec ファイルを更新します。Oracle SQL コマンドを使用します。
  11. makefile を実行します。
  12. copy nt\bankapp.mak to %APPDIR%
    nmake -f bankapp.mak
  13. 次のように、nt\ubbshm を編集します。
  14. USER_ID=0
    GROUP_ID=0
    UNAME_SITE1= ホスト名で返されるノード名
    TUXDIR= bankvar で指定された値
    APPDIR= bankvar で指定された値
  15. 次のように、コンフィグレーション ファイルの GROUPS セクションを変更します。
  16. 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=."
  17. バイナリ形式の Oracle Tuxedo コンフィグレーション ファイルを作成します。
  18. tmloadcf -y nt/ubbshm
  19. マスタ マシン上にデバイス リストと TLOG デバイスを作成します。
  20. crtlog -m
  21. Oracle データベース インスタンスが起動されていない場合は起動します。
  22. Oracle Tuxedo システム サーバを起動します。
  23. tmboot -y
  24. v$XATRANS$ ビューがデータベースにあることを確認します。V$XATRANS$ ビューは、XA ライブラリのインストール時に作成されます。
  25. v$XATRANS$ ビューが作成されていない場合は、次のように作成します。
    • 環境変数 ORACLE_HOME および ORACLE_SID が設定されていることを確認します。
    • SYS としてデータベースにログインします。
    • Execute the sql script ${ORACLE_HOME}/RDBMS80/ADMIN/XAVIEW.sql
    • XA ライブラリを使用するすべての Oracle アカウント アプリケーションのビューに対する SELECT 特権を認めます。
  26. bankapp データベースと Oracle RM のデータベース オブジェクトを作成します。
    • Oracle ユーティリティ SQL*plus または SQL*DBA に、任意の Oracle ユーザとしてログインします。
    • notepad crbank-ora8.sql
    • Oracle 8 のインストール時にサンプル データベースが作成されます。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) ;
  27. 前述の手順に従って、パスワードが PaSsWd2 である user2、およびパスワードが PaSsWd3 である user3 を作成します。
  28. SQL*plus> start $APPDIR/ crbank-ora8.sql
  29. データベースにデータを追加します。
  30. nt\populate
  31. データベースに対してトランザクションを生成します。
  32. driver
  33. bankapp クライアントを実行します。
  34. run
  35. アプリケーションを停止します。
  36. tmshutdown -y

関連項目

 


ステップ 6 : コンフィグレーション ファイルの編集

コンフィグレーション ファイルには、アプリケーションの実行方法が定義されています。bankapp には、テキスト形式のコンフィグレーション ファイル (UBBCONFIG(5) を参照) が 2 つ提供されています。単一のコンピュータ上のアプリケーションを定義する ubbshm と、ネットワーク上のアプリケーションを定義する ubbmp です。

初期化スクリプトは、サンプル アプリケーションに提供されています。また、ご使用のコンフィグレーションおよびマシンに合わせて、.sh を使用して 10 個までの完全なコンフィグレーション ファイルを生成できます。

  1. テキスト エディタで、bankappubbshm および ubbmp コンフィグレーション ファイルの内容を確認します。
  2. コード リスト 3-18 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 のネットワーク リスナ アドレス>"
  3. アプリケーションのパスワード機能を有効にするために、次の行を ubbshm または ubbmpRESOURCES セクションに追加します。
  4.     SECURITY       APP_PW
  5. 両方のコンフィグレーション ファイルで、一部のパラメータが山かっこ (< >) で囲まれています。山かっこで囲まれた文字列は、実際のインストールに合わせた値に置き換えます。これらのフィールドは、RESOURCESMACHINES、および GROUPS セクションにあります。ubbmp では、NETWORK セクションにも置き換えが必要な値があります。次の表は、ubbmpNETWORK セクションについて説明しています。また、単一マシン用のアプリケーションを作成する際、RESOURCESMACHINES、および GROUPS の各セクションに必要となる変更もすべて示しています。
  6. 表 3-3 値の説明
    行番号
    置き換える文字列
    説明
    001
    UID
    掲示板の IPC 構造体のオーナーを示す有効なユーザ ID (UID)。マルチプロセッサ コンフィグレーションでは、この値はすべてのマシンで同じにする必要があります。この値を Oracle Tuxedo システム ソフトウェアのオーナーと同じにすると、簡単に統一できます。
    002
    GID
    掲示板の IPC 構造体のオーナーを示す有効なグループ ID (GID)。マルチプロセッサ コンフィグレーションでは、この値はすべてのマシンで同じにする必要があります。アプリケーションの各ユーザは、このグループ ID を共有する必要があります。
    003
    SITE1 の名前
    マシン名。UNIX プラットフォームでは、UNIX コマンド uname -n で出力される値を使用します。
    004
    TUXDIR
    Oracle Tuxedo ソフトウェアのルート ディレクトリの絶対パス名。ファイルに出現するすべての <TUXDIR> を特定のパス名に置き換えます。
    005
    APPDIR
    アプリケーションを実行するディレクトリの絶対バス名。ファイルに出現するすべての <APPDIR> を特定のパス名に置き換えます。
    006
    マシン タイプ
    異なる種類のマシンが存在するネットワーク アプリケーションで使用される識別文字列。Oracle Tuxedo システムでは、通信を行う各マシンのマシン タイプの値が確認されます。通信を行う 2 つのマシンのマシン タイプが異なる場合は、メッセージのエンコード/デコード ルーチンが呼び出されて、両方のマシンで認識される形式にデータが変換されます。
    007
    SITE2 の名前
    2 番目のマシン名。UNIX プラットフォームでは、UNIX コマンド uname -n で出力される値を使用します。
    008
    OPENINFO
    この文とそれに続くエントリは、Oracle Tuxedo システムのリソース マネージャで認識される形式になっています。ほかのリソース マネージャで認識されるように変更 (または削除) する必要があります。
    009
    SITE1 のネットワーク アドレス
    このマシンの BRIDGE プロセスに対するネットワーク リスナのアドレス。
    010
    SITE1 のネットワーク リスナ アドレス
    このマシンの tlisten プロセスに対するネットワーク リスナのアドレス。
    011
    SITE2 のネットワーク アドレス
    このマシンの BRIDGE プロセスに対するネットワーク リスナのアドレス。マシンごとに異なる値を指定する必要があります。
    012
    SITE2 のネットワーク リスナ アドレス
    このマシンの tlisten プロセスに対するネットワーク リスナのアドレス。

関連項目

 


ステップ 7 とステップ 8 : バイナリ形式のコンフィグレーション ファイルとトランザクション ログ ファイルの作成

バイナリ形式のコンフィグレーション ファイルを作成する前に

バイナリ形式のコンフィグレーション ファイルを作成する場合、bankapp ファイルが置かれたディレクトリに移動し、環境変数を設定することが必要です。その場合、次の手順に従います。

  1. bankapp ファイルが置かれたディレクトリに移動します。
  2. 次のコマンドを入力して、環境変数を設定します。
  3. . ./bankvar

注意 : SHM モードで bankapp を実行する場合は、tlisten プロセスを作成したり、別のマシンにトランザクション ログを作成する必要はありません。

コンフィグレーション ファイルのロード

コンフィグレーション ファイルを編集したら、それを MASTER マシン上にバイナリ ファイルとしてロードする必要があります。バイナリ形式のコンフィグレーション ファイルの名前は TUXCONFIG、そのパス名は TUXCONFIG 環境変数に定義されています。このファイルは、Oracle Tuxedo のシステム管理者の有効なユーザ ID およびグループ ID を持つユーザが作成します。この 2 つの ID は、ご使用のコンフィグレーション ファイルの UID および GID の値と同じであることが必要です。同じではない場合、bankapp の実行時にパーミッションの問題が発生します。

  1. 次のコマンドを入力して、TUXCONFIG を作成します。
  2.     tmloadcf ubbmp

    コンフィグレーションのロード時には、このコンフィグレーションをインストールするかどうか、およびインストールする場合は既存のコンフィグレーション ファイルを上書きすることを確認するメッセージが何回か表示されます。このような確認を省くには、コマンドラインで -y オプションを指定します。

  3. アプリケーションで必要な IPC リソースを Oracle Tuxedo システムで計算する場合は、コマンドラインで -c オプションを指定します。

TUXCONFIG は、MASTER マシン上だけにインストールできます。アプリケーションの起動時に tmboot によってほかのマシンに伝播されます。

コンフィグレーションのオプションとして SECURITY が指定されている場合、tmloadcf の実行時にアプリケーション パスワードの入力が求められます。30 文字までのパスワードを指定できます。アプリケーションに参加するクライアント プロセスでは、パスワードを入力する必要があります。

ロードする前に tmloadcf によってテキスト形式のコンフィグレーション ファイル (UBBCONFIG) が解析されます。構文エラーが検出された場合、ファイルのロードは失敗します。

トランザクション ログ (TLOG) ファイルの作成

TLOG は、Oracle Tuxedo システムがグローバル トランザクションを管理するために使用するトランザクション ログです。アプリケーションを起動する前に、アプリケーションのすべてのマシン上のすべてのファイルに TLOG のエントリが作成されることが必要です。また、ログ自体のファイルは、MASTER マシン上に作成されることが必要です。

bankapp では、デバイス リストと TLOG を作成する crtlog と呼ばれるスクリプトが提供されています。デバイス リストは、bankvarTLOGDEVICE 変数を使用して作成されます。

  1. MASTER マシンで次のコマンドを入力して、TLOG およびデバイス リストを作成します。
  2.     crtlog -m
    注意 : プロダクション環境では、デバイス リストはデータベースで使用されているものと同じでもかまいません。
  3. ほかのすべてのマシンでは、-m オプションを指定する必要はありません。システムの起動時に、MASTER 以外のマシン上の BBL によってログが作成されます。

XA 準拠ではないリソース マネージャを使用している場合、トランザクション ログは不要です。

関連項目

 


ステップ 9 : 各マシン上でのリモート サービス接続の作成

tlisten はリスナ プロセスで、Oracle Tuxedo アプリケーションのマシン間で tmboot などのプロセスにリモート サービス接続を提供します。コンフィグレーション ファイルの NETWORK セクションで定義されたネットワーク上のすべてのマシンにインストールされていることが必要です。

tlisten の起動については、『Oracle Tuxedo システムのインストール』の「tlisten プロセスの開始」を参照してください。

  1. bankapp 用に新たに tlisten プロセスを起動することをお勧めします。その場合、次のコマンドを入力します。
  2.     tlisten -l nlsaddr

    nlsaddr の値は、コンフィグレーション ファイルでこのマシンの NLSADDR パラメータに指定された値と同じにする必要があります。この値はマシンによって異なるため、tlisten の引数がコンフィグレーション ファイルで指定された値と一致していることが重要です。

    注意 : この指定に関するエラーは、簡単には検出できません。tmloadcf では、コンフィグレーション ファイルの値と tlisten コマンドの引数が一致しているかどうかは確認されません。この 2 つのアドレスが異なる場合、nlsaddr の値が一致しないマシンで起動に失敗します。また、tlisten プロセスが開始されていないマシンでも起動に失敗します。

tlisten で使用されるログ ファイルは、Oracle Tuxedo システムのほかのすべてのログ ファイルとは別のログ ファイルです。ただし、複数の tlisten プロセスで 1 つのログ ファイルを使用できます。デフォルトのファイル名は、TUXDIR/udataobj/tlog です。

リスナ プロセス (tlisten) の停止

tlisten は、デーモン プロセスとして実行されます。tlisten を起動スクリプトに組み込んだり、cron ジョブとして実行する方法については、『Tuxedo コマンド リファレンス』の「tlisten(1)」を参照してください。

bankapp では、tlisten に対して開始または終了のどちらかの操作しかできません。tlisten を終了するには、次のように SIGTERM シグナルを送信します。

kill -15 pid

注意 : Windows 2003 環境でリスナ プロセスを開始または停止するには、コマンドラインで tlisten を実行するか、またはコントロール パネルを使用します。

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 を起動し、各種のクライアント プログラムとトランザクションを行ってテストし、終了する手順について順に説明します。各作業をクリックすると、その作業を行う手順が表示されます。

 


ステップ 1 : 起動する前に行う準備作業

  1. bankapp を起動する前に、アプリケーションをサポートするのに十分な IPC リソースがマシンにあることを確認します。IPC リソースに関するレポートを出力するには、tmboot コマンドに -c オプションを指定します。
  2. 注意 : IPC リソースが不足していると起動が失敗する場合があるので、コンフィグレーションに対して適切な値が指定されていることを確認してください。
    コード リスト 3-19 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 です。
  3. プロセッサごとに使用されるクライアント アプリケーションの数を各 MSGMNI 値に追加します。MSGMAPMSGMNI の 2 倍にします。
  4. IPC の最低条件とご使用のマシンに対して設定されたパラメータとを比較します。これらのパラメータを定義する場所は、プラットフォームによって異なります。
    • ほとんどの UNIX システム プラットフォームの場合、マシンのパラメータは /etc/conf/cf.d/mtune に定義されています。
    • Windows 2003 プラットフォームの場合、マシンのパラメータはコントロール パネルで設定したり表示します。

関連項目

 


ステップ 2 : bankapp の起動

  1. 環境変数を設定します。
  2. . ./bankvar
  3. 次のコマンドを入力して、アプリケーションを起動します。
  4.     tmboot

    次のプロンプトが表示されます。

        すべての TUXEDO 管理プロセスとアプリケーションのサーバ・プロセスを起動させますか?(y/n): y

    次のようなレポートが画面に出力されます。

    /usr/me/appdir/tuxconfig のすべての TUXEDO 管理プロセスとアプリケーションのサーバ・プロセスを起動します。
    すべての TUXEDO 管理プロセスを起動します。
    exec BBL -A:
    プロセス ID=24223 を起動しました。

このレポートは、コンフィグレーション内のすべてのサーバが起動するまで出力されます。起動したサーバの合計数が出力された時点で終了します。

必要であれば、コンフィグレーションの一部のサーバだけを起動することもできます。たとえば、管理サーバだけを起動するには、-A オプションを指定します。オプションが指定されていない場合は、アプリケーション全体が起動します。

tmboot では、起動したサーバ数がレポートされるほかに、ULOG にメッセージが送信されます。

関連項目

 


ステップ 3 : データベースへのデータの追加

populate.sh は、データベースにレコードを追加するシェル スクリプトです。このスクリプトを使用して、bankapp を実行して、その機能をテストします。populate は、gendata と呼ばれるプログラムからシステム サーバ ud にレコードを渡す 1 行のスクリプトです。gendata プログラムは、10 支店、30 窓口、200 口座のレコードを作成します。作成されたファイル内のレコードは、pop.out に記録されるので、サービス要求の作成時にデータベースの値を使用することができます。

スクリプトを実行するには、「populate」と入力します。

注意 : populate スクリプトで出力された pop.out では、口座番号や支店番号などのフィールドを指定して取得できるので、自分のサービス要求に対する出力を生成できます。

関連項目

 


ステップ 4 : bankapp サービスのテスト

  1. 実行中のシステムにログインする場合は、bankapp に環境変数を設定する必要があります。その場合、次のコマンドを入力します。
  2.     . ./bankvar
  3. audit クライアント プログラムを実行します。その場合、次のコマンドを入力します。
  4.     audit {-a | -t} [branch_id]

    口座残高を取得する場合は -a、窓口残高を取得する場合は -t を指定します。branch_id が指定されている場合、指定された支店だけがレポートされます。指定されていない場合、すべての支店データがレポートされます。口座番号、支店番号など audit に入力する値には、populate プログラムの出力である pop.out にリストされている値を使用できます。

  5. auditcon を実行します。audit プログラムの会話型バージョンを起動するには、次のコマンドを入力します。
  6.     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 ??
  7. このメッセージは、q を入力するまで繰り返し表示されます。
  8. driver プログラムを使用します。デフォルトでは、driver プログラムは 300 のトランザクションを生成します。トランザクションの数を変更する場合は、次のように -n オプションを使用します。
  9.     driver -n1000

    このコマンドは、プログラムが 1000 回ループして実行されることを指定しています。

    driver は、システム上での処理をシミュレートするための一連のトランザクションを生成するスクリプトです。このスクリプトは、bankapp の一部として含まれているので、tmadmin コマンドを実行して実際的な統計を取得できます。

関連項目

 


ステップ 5 : bankapp の停止

bankapp を終了するには、次のように、引数を指定せずに tmshutdown(1) コマンドを MASTER マシンで入力します。

$ tmshutdown
すべてのアプリケーションのサーバ・プロセスをシャットダウンさせますか?(y/n): y
/usr/me/BANKAPP/TUXCONFIG のすべてのアプリケーションのサーバ・プロセスをシャットダウンします。
アプリケーションのサーバ・プロセスをシャットダウンします。

サーバ Id = 1 グループ Id = BANKB1 マシン = Site1: シャットダウンしました。

このコマンド (または tmadmin の停止コマンド) を実行すると、次のタスクが行われます。

関連項目


  ページの先頭       前  次