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

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

クライアントのコーディング

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

 


アプリケーションへの参加

クライアントがサービスを要求する場合、Oracle Tuxedo アプリケーションに明示的または暗黙的に参加している必要があります。アプリケーションに参加すると、クライアントは要求を送り、その応答を受け取ることができるようになります。

クライアントが明示的にアプリケーションに参加するには、次の文法を指定して tpinit(3c) 関数を呼び出します。

int
tpinit (TPINIT *tpinfo)

クライアントが tpinit() 関数を呼び出す前にサービス要求 (または ATMI 関数) を呼び出すと、暗黙的にアプリケーションに参加したことになります。その場合、tpinfo 引数が NULL に設定されて、tpinit() 関数がクライアントではなく Oracle Tuxedo システムによって呼び出されます。tpinfo 引数は、タイプが TPINIT、サブタイプが NULL の型付きバッファを指します。TPINIT 型バッファは atmi.h ヘッダ ファイルに定義されており、次の情報が格納されています。

char usrname[MAXTIDENT+2]; 
char
cltname[MAXTIDENT+2];
char
passwd[MAXTIDENT+2];
char
grpname[MAXTIDENT+2];
long
flags;
long
datalen;
long
data;

次の表は、TPINIT データ構造体のフィールドを示しています。

表 4-1 TPINIT データ構造体のフィールド
フィールド
説明
usrname
クライアントを表す名前。ブロードキャスト通知と管理統計情報の検索に使用されます。クライアントは、tpinit() 関数を呼び出すときに usrname に値を設定します。この値には、最大文字数が MAXTIDENT で、最後が NULL で終わる文字列を指定します。最大文字数のデフォルト値は 30 ですが、管理者が変更できます。
cltname
アプリケーション定義のセマンティクスに従ったクライアント名。30 文字以内で最後が NULL で終わる文字列を指定します。ブロードキャスト通知と管理統計情報の検索に使用されます。クライアントは、tpinit() 関数を呼び出すときに cltname に値を設定します。この値には、最大文字数が MAXTIDENT で、最後が NULL で終わる文字列を指定します。最大文字数のデフォルト値は 30 ですが、管理者が変更できます。

注意 : sysclient の値は、cltname フィールド用に予約されています。

passwd
非暗号化形式のアプリケーション パスワード。ユーザ認証に使用されます。30 文字以内の文字列を指定します。
grpname
クライアントをリソース マネージャ グループに対応付ける値。grpname が長さ 0 の文字列として設定されている場合、クライアントはリソース マネージャに対応付けられず、デフォルトのクライアント グループに属します。ワークステーション クライアントの場合、grpname の値には NULL 文字列 (長さが 0 の文字列) を指定します。ワークステーション クライアントの詳細については、『Oracle Tuxedo Workstation コンポーネント』を参照してください。
flags
クライアント固有の通知メカニズム、およびシステム アクセスのモード。この値により、マルチコンテキスト モードとシングルコンテキスト モードが制御されます。フラグの詳細については、「非請求通知の処理」、または『Oracle Tuxedo C リファレンス』の tpinit() を参照してください。
datalen
アプリケーション固有データの長さ。TPINIT 型バッファのバッファ タイプ スイッチ エントリは、そのバッファに渡される合計サイズに基づいてこのフィールドを設定します。アプリケーション データのサイズは、合計サイズから TPINIT 構造体自体のサイズを差し引き、その値に構造体に定義されているデータ プレースホルダのサイズを加算したものです。
data
アプリケーション定義の認証サービスに転送される可変長データ用のプレース ホルダ。

クライアント プログラムは、アプリケーションに参加する前に tpalloc() を呼び出して TPINIT バッファを割り当てる必要があります。次のサンプル コードは、TPINIT バッファを割り当て、そのバッファを使用してアプリケーション固有の 8 バイトのデータを tpinit() 関数に渡す方法を示しています。

コード リスト 4-1 TPINIT 型バッファの割り当て
.
.
.
TPINIT *tpinfo;
.
.
.
if ((tpinfo = (TPINIT *)tpalloc("TPINIT",(char *)NULL,
TPINITNEED(8))) == (TPINIT *)NULL){
Error Routine
}

TPINIT 型バッファの詳細については、『Oracle Tuxedo C リファレンス』の tpinit() を参照してください。

関連項目

 


TPINIT 型バッファの機能

次の TPINIT 型バッファの機能をクライアントで利用するには、tpinit() 関数を明示的に呼び出す必要があります。

クライアントの名前付け

クライアントがアプリケーションに参加すると、Oracle Tuxedo システムによって一意なクライアント識別子が割り当てられます。識別子は、クライアントによって呼び出される各サービスに渡されます。識別子は、非請求通知に使用することもできます。

ユニークなクライアント名とユーザ名をそれぞれ 30 文字以内で割り当てることもできます。その場合、tpinfo バッファ引数を使用して名前を tpinit() 関数に渡します。Oracle Tuxedo システムでは、各プロセスに対応付けられているクライアント名とユーザ名、およびプロセスが実行されているマシンの論理マシン ID (LMID) を組み合わせることにより、そのプロセスに対して一意な識別子が使用されます。これらのフィールド値を取得する方法は選択することができます。

注意 : プロセスがアプリケーションの管理ドメイン以外で実行されている場合 (つまり、管理ドメインに接続されたワークステーション上で実行されている場合)、アプリケーションにアクセスするためにワークステーション クライアントで使用されているマシンの LMID が割り当てられます。

クライアント プロセスに対して一意な識別子が作成されると、次の操作を行うことができます。

非請求メッセージの送受信の詳細については、「イベント ベースのクライアントおよびサーバのコーディング」を参照してください。tmadmin(1) の詳細については、『Oracle Tuxedo C リファレンス』を参照してください。

次の図は、アプリケーションにアクセスするクライアントに名前を割り当てる方法を示しています。この例では、ジョブ関数を示す cltname フィールドがアプリケーションで使用されています。

図 4-1 クライアントの名前付け

クライアントの名前付け

非請求通知の処理

非請求通知とは、クライアントが予期していないサービス要求に対する応答 (またはエラー コード) を受け取る通信です。たとえば、管理者が 5 分後にシステムをシャットダウンすることを通知するメッセージをブロードキャストした場合などです。

クライアントに非請求メッセージを通知する方法は数多くあります。たとえば、オペレーティング システムがクライアントにシグナルを送って、クライアントの現在の処理を中断させる方法があります。Oracle Tuxedo システムでは、ATMI 関数が呼び出されるたびに非請求メッセージが到着していないかどうかがデフォルトで確認されます。これはディップ インと呼ばれる方法で、次の利点があります。

ディップ インでは、メッセージの到着を確認するまでの間隔が長い場合があります。そのため、アプリケーションで tpchkunsol() 関数を呼び出して、既に到着している非請求メッセージがないかどうかを確認できます。tpchkunsol() 関数の詳細については、「イベント ベースのクライアントおよびサーバのコーディング」を参照してください。

クライアントが tpinit() 関数を使用してアプリケーションに参加する場合、フラグを定義して非請求メッセージの処理方法を指定できます。クライアントへの通知では、次の表に示す値を flags に指定できます。

表 4-2 TPINIT 型バッファのクライアント通知でのフラグ
Flag
説明
TPU_SIG
シグナルによる任意通知を選択します。このフラグは、シングル スレッドでシングル コンテキストのアプリケーションのみで使用します。このモードの利点は、直ちに通知できることです。このモードには、次のような不都合があります。
  • ネイティブ クライアントを実行している場合、呼び出し側プロセスで送信元プロセスと同じ UID を使用する必要があります。ワークステーション クライアントには、この制約はありません。
  • すべてのプラットフォーム上で TPU_SIG が使用できるわけではありません。特に、MS-DOS ワークステーションでは使用できません。
システムや環境の要件を満たしていない場合にこのフラグを指定すると、フラグに TPU_DIP が設定され、ログにイベントが記録されます。
TPU_DIP (デフォルト)
ディップ インを使用した非請求メッセージを指定します。クライアントは tpsetunsol() 関数を使用してメッセージ処理関数の名前を指定し、tpchkunsol() 関数を使用して待機中の非請求メッセージを確認できます。
TPU_THREAD
別のスレッド内の THREAD 通知を指定します。このフラグは、マルチスレッドをサポートするプラットフォーム専用です。マルチスレッドがサポートされていないプラットフォームで TPU_THREAD を指定すると、無効な引数として処理されます。その結果、tperrno(5) エラーが返されて TPEINVAL が設定されます。
TPU_IGN
任意通知を無視します。

TPINIT 型バッファ フラグの詳細については、『Oracle Tuxedo C リファレンス』の「tpinit(3c)」を参照してください。

システム アクセス モード

アプリケーションは、protected または fastpath のいずれかのモードで Oracle Tuxedo システムにアクセスできます。クライアントは、tpinit() 関数を使用してアプリケーションに参加するときに、モードを要求できます。モードを指定するには、TPINIT バッファの flags フィールドにいずれかのモードを指定して、その値を tpinit() 関数に渡します。

表 4-3 TPINIT 型バッファのシステム アクセス フラグ
モード
説明
PROTECTED
アプリケーション内で ATMI 関数を呼び出し、共用メモリを使用して Oracle Tuxedo システムの内部テーブルにアクセスします。Oracle Tuxedo システム ライブラリ外のアプリケーション コードからのアクセスに対して、共用メモリを保護します。この値は、NO_OVERRIDE が指定されている場合を除き、UBBCONFIG の値に優先します。UBBCONFIG の詳細については、『Oracle Tuxedo アプリケーションの設定』を参照してください。
FASTPATH (デフォルト)
アプリケーション コード内で ATMI 関数を呼び出し、共用メモリを使用して Oracle Tuxedo システム内部にアクセスします。Oracle Tuxedo システム ライブラリ外のアプリケーション コードからのアクセスに対して、共用メモリを保護しません。この値は、NO_OVERRIDE が指定されている場合を除き、UBBCONFIG の値に優先します。UBBCONFIG の詳細については、『Oracle Tuxedo アプリケーションの設定』を参照してください。

リソース マネージャとの対応付け

アプリケーション管理者は、リソース マネージャに対応付けられたサーバ (トランザクションを調整するための管理プロセスを提供するサーバを含む) をグループ化できます。グループの定義については、『Oracle Tuxedo アプリケーションの設定』を参照してください。

アプリケーションに参加している場合、クライアントは TPINIT 型バッファの grpname フィールドにグループ名を指定して、特定のグループに参加できます。

クライアント認証

Oracle Tuxedo システムでは、オペレーティング システムのセキュリティ、アプリケーション パスワード、ユーザ認証、省略可能なアクセス制御リスト、必須のアクセス制御リスト、リンク レベルの暗号化などのセキュリティ レベルを設定できます。セキュリティ レベル設定の詳細については、『Oracle Tuxedo アプリケーションの設定』を参照してください。

セキュリティ レベルとしてアプリケーション パスワードが設定されている場合、アプリケーションに参加するときに、すべてのクライアントがアプリケーション パスワードを入力する必要があります。管理者はアプリケーション パスワードを設定したり変更できます。また、そのパスワードを有効なユーザに提供する必要があります。

このレベルのセキュリティが設定されていると、Oracle Tuxedo システムで提供される ud() などのクライアント プログラムでは、アプリケーション パスワードの入力が求められます。ud、wud(1) の詳細については、『Oracle Tuxedo アプリケーション実行時の管理』を参照してください。アプリケーション固有のクライアント プログラムには、ユーザからパスワードを取得するコードが記述されていることが必要です。クライアントがアプリケーションに参加するために tpinit() を呼び出すと、非暗号化パスワードが TPINIT バッファに格納されて評価されます。

注意 : パスワードは画面には表示されません。

tpchkauth(3c) 関数を使用すると、次の内容を確認できます。

通常、クライアントは tpinit() より先に tpchkauth() 関数を呼び出して、初期化時に指定する必要のあるセキュリティ情報を確認します。

セキュリティのプログラミング手法の詳細については、『Oracle Tuxedo CORBA アプリケーションのセキュリティ機能』を参照してください。

 


アプリケーションからの分離

クライアントがすべてのサービスを要求して、それに対する応答を受信したら、tpterm(3c) 関数を使用してアプリケーションから分離できます。tpterm() 関数には引数がなく、エラー時には – 1 を返します。

 


クライアントのビルド

実行可能クラアイントをビルドするには、buildclient(1) コマンドを実行して、Oracle Tuxedo システム ライブラリとそのほかのすべての参照ファイルを使用してアプリケーションをコンパイルします。次は、buildclient コマンドの構文です。

buildclient filename.c -o filename -f filenames -l filenames

次の表は、buildclient コマンドのオプションを示しています。

表 4-4 buildclient のオプション
オプションまたは引数
説明
filename.c
コンパイルする C 言語のアプリケーション。
-o filename
実行可能な出力ファイル。出力ファイルのデフォルト名は a.out です。
-f filenames
Oracle Tuxedo システムのライブラリより先にリンクされるファイルのリスト。-f オプションは、コマンドラインで複数回指定できます。また、各 -f に複数のファイル名を指定できます。C プログラム ファイル (file.c) を指定すると、リンクされる前にコンパイルが行われます。ほかのオブジェクト ファイル (file.o) を個別に、またはアーカイブ ファイル (file.a) にまとめて指定することもできます。
-l filenames
Oracle Tuxedo システム ライブラリの後にリンクされるファイルのリスト。-l オプションは、コマンドラインで複数回指定できます。また、各 -l に複数のファイル名を指定できます。C プログラム ファイル (file.c) を指定すると、リンクされる前にコンパイルが行われます。ほかのオブジェクト ファイル (file.o) を個別に、またはアーカイブ ファイル (file.a) にまとめて指定することもできます。
-r
実行可能サーバにリンクされるリソース マネージャのアクセス ライブラリ。アプリケーション管理者は、buildtms(1) コマンドを使用して、すべての有効なリソース マネージャ情報を $TUXDIR/updataobj/RM ファイルに事前に定義しておく必要があります。指定できるリソース マネージャは 1 つだけです。詳細については、『Oracle Tuxedo アプリケーションの設定』を参照してください。

注意 : Oracle Tuxedo ライブラリは自動的にリンクされます。コマンドラインに Oracle Tuxedo ライブラリを指定する必要はありません。

リンクするライブラリ ファイルの指定順序は重要です。関数を呼び出す順序と、それらの関数への参照を含むライブラリによって、この順序が決定されます。

デフォルトでは、buildclient コマンドは UNIX の cc コマンドを呼び出します。環境変数 CC を指定して別のコンパイル コマンドを指定したり、CFLAGS を指定してコンパイル フェーズやリンク フェーズにフラグを設定することができます。詳細については、「環境変数の設定」を参照してください。

buildclient -C -o audit -f audit.o

次のコマンドラインの例では、C プログラム audit.c をコンパイルして、実行可能ファイル audit を生成しています。

buildclient – o audit – f audit.c

関連項目

 


クライアント プロセスの例

次の擬似コードは、通常のクライアント プロセスがアプリケーションに参加してから分離するまでの処理を示しています。

コード リスト 4-2 クライアント プロセスのパラダイム
main()
{
セキュリティ レベルをチェック
tpsetunsol() を呼び出して、TPU_DIP 用にハンドラを命名
usrname、cltname を取得
アプリケーション パスワードの入力を要求
TPINIT バッファを割り当て
TPINIT バッファ構造体メンバーに値を格納

if (tpinit((TPINIT *) tpinfo) == -1){
エラー ルーチン;
}

ユーザ入力が存在する間に
メッセージ バッファを割り当て {
ユーザ入力をバッファに格納
サービス呼び出しを行う
応答を受信
非請求メッセージを確認
}
バッファを解放
.. .
if (tpterm() == -1){
エラー ルーチン;
}
}

エラーが発生すると -1 が返され、アプリケーションが外部グローバル変数 tperrno にエラーの原因を示す値を設定します。tperrno は、atmi.h ヘッダ ファイルに定義されています。詳細については、『Oracle Tuxedo のファイル形式とデータ記述方法』の tperrno(5) を参照してください。通常、プログラマが発生したエラーの種類を示すエラー コードをこのグローバル変数に設定します。tperrno の値については、「システム エラー」を参照してください。各 ATMI 呼び出しで返される全エラー コードのリストについては、『Oracle Tuxedo C リファレンス』の「C 言語アプリケーション トランザクション モニタ インタフェースについて」を参照してください。

次の例は、tpinit()tpterm() 関数の使用方法を示しています。このサンプル コードは、Oracle Tuxedo ソフトウェアに提供されている銀行業務のサンプル アプリケーション bankapp から引用したものです。

コード リスト 4-3 アプリケーションへの参加と分離
#include <stdio.h>         /* UNIX */
#include <string.h> /* UNIX */
#include <fml.h> /* BEA Tuxedo システム */
#include <atmi.h> /* BEA Tuxedo システム */
#include <Uunix.h> /* BEA Tuxedo システム */
#include <userlog.h> /* BEA Tuxedo システム */
#include "bank.h" /* 銀行業務アプリケーションのマクロ定義 */
#include "aud.h" /* 銀行業務アプリケーションの VIEW 定義 */

...

main(argc, argv)
int argc;
char *argv[];

{
...
if (strrchr(argv[0],'/') != NULL)
proc_name = strrchr(argv[0],'/')+1;
else
proc_name = argv[0];
...
/* アプリケーションへの参加 */
if (tpinit((TPINIT *) NULL) == -1) {
(void)userlog("%s: failed to join application\n", proc_name);
exit(1);
}
...
/* アプリケーションからの分離 */
if (tpterm() == -1) {
(void)userlog("%s: failed to leave application\n", proc_name);
exit(1);
}
}

この例は、tpinit() を呼び出すことによって、アプリケーションに参加しているクライアント プロセスを示しています。エラー (戻り値が – 1) が発生すると、このプロセスは C プログラム文の printf() と似た引数を取る userlog() を呼び出して、中央イベント ログにメッセージを書き込みます。詳細については、『Oracle Tuxedo C リファレンス』の「userlog(3c)」を参照してください。

同様に、tpterm() を呼び出し、エラーが発生すると、このプロセスは中央イベント ログにメッセージを書き込みます。


  ページの先頭       前  次