ATMIクライアントがサービスをリクエストする場合、Oracle Tuxedo ATMIアプリケーションに明示的または暗黙的に参加している必要があります。アプリケーションに参加すると、クライアントはリクエストを送り、その応答を受け取ることができるようになります。
クライアントが明示的にアプリケーションに参加するには、次のシグネチャを指定して
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;
表4-1は、
TPINITデータ構造体のフィールドをまとめたものです。
|
|
|
クライアントを表す名前。ブロードキャスト通知と管理統計情報の検索に使用されます。クライアントは、 tpinit()関数を呼び出すときに usrnameに値を設定します。この値には、最大文字数が MAXTIDENT (30文字)で、最後がNULLで終わる文字列を指定します。
|
|
アプリケーション定義のセマンティクスに従ったクライアント名。30文字以内で最後がNULLで終わる文字列を指定します。ブロードキャスト通知と管理統計情報の検索に使用されます。クライアントは、 tpinit()関数を呼び出すときに cltnameに値を設定します。この値には、最大文字数が MAXTIDENT (30文字)で、最後がNULLで終わる文字列を指定します。
注意:
|
sysclientの値は、 cltnameフィールド用に予約されています。
|
|
|
非暗号化形式のアプリケーション・パスワード。ユーザー認証に使用されます。30文字以内の文字列を指定します。
|
|
クライアントをリソース・マネージャ・グループに関連付ける値。これが長さ0の文字列に設定されている場合、クライアントはリソース・マネージャに関連付けられず、デフォルトのクライアント・グループに属します。ワークステーション・クライアントの場合、 grpnameの値にはNULL文字列(長さが0の文字列)を指定します。ワークステーション・クライアントの詳細は、 『ATMIワークステーション・コンポーネントの使用』を参照してください。
|
|
クライアント固有の通知メカニズム、およびシステム・アクセスのモード。この値により、マルチコンテキスト・モードとシングル・コンテキスト・モードが制御されます。フラグの詳細は、 4-5ページの「非請求通知の処理」、または 『Oracle Tuxedo ATMI C言語関数リファレンス』の 「tpinit()」を参照してください。
|
|
アプリケーション固有データの長さ。 TPINIT型バッファのバッファ・タイプ・スイッチ・エントリは、そのバッファに渡される合計サイズに基づいてこのフィールドを設定します。アプリケーション・データのサイズは、合計サイズから TPINIT構造体自体のサイズを差し引き、その値に構造体に定義されているデータ・プレースホルダーのサイズを加算したものです。
|
|
アプリケーション定義の認証サービスに転送される可変長データ用のプレース・ホルダー。
|
クライアント・プログラムは、アプリケーションに参加する前に
tpalloc()を呼び出して
TPINITバッファを割り当てる必要があります。
リスト4-1は、
TPINITバッファを割り当て、そのバッファを使用してアプリケーション固有の8バイトの
データを
tpinit()関数に渡す方法を示しています。
.
.
.
TPINIT *tpinfo;
.
.
.
if ((tpinfo = (TPINIT *)tpalloc("TPINIT",(char *)NULL,
TPINITNEED(8))) == (TPINIT *)NULL){
Error Routine
}
TPINIT型バッファの詳細は、『Oracle Tuxedo ATMI C言語関数リファレンス』の
tpinit()を参照してください。
ATMIクライアントがアプリケーションに参加すると、Oracle Tuxedoシステムによって一意のクライアント識別子が割り当てられます。識別子は、クライアントによって呼び出される各サービスに渡されます。識別子は、非請求通知に使用することもできます。
ユニークなクライアント名とユーザー名をそれぞれ30文字以内で割り当てることもできます。その場合、
tpinfoバッファ引数を使用して名前を
tpinit()関数に渡します。Oracle Tuxedoシステムでは、各プロセスに関連付けられているクライアント名とユーザー名、およびプロセスが実行されているマシンの論理マシンID (LMID)を組み合せることにより、そのプロセスに対して一意な識別子が使用されます。これらのフィールド値を取得する方法は選択することができます。
注意:
|
プロセスがアプリケーションの管理ドメイン以外で実行されている場合(つまり、管理ドメインに接続されたワークステーション上で実行されている場合)、アプリケーションにアクセスするためにワークステーション・クライアントで使用されているマシンのLMIDが割り当てられます。
|
クライアント・プロセスに対して一意な識別子が作成されると、次の操作を行うことができます。
図4-1は、アプリケーションにアクセスするクライアントに名前を関連付ける方法を示しています。この例では、ジョブ関数を示す
cltnameフィールドがアプリケーションで使用されています。
非請求通知とは、ATMIクライアントが予期していないサービス・リクエストに対するレスポンス(またはエラー・コード)を受け取る通信です。たとえば、管理者が5分後にシステムをシャットダウンすることを通知するメッセージをブロードキャストした場合などです。
クライアントに非請求メッセージを通知する方法は数多くあります。たとえば、オペレーティング・システムがクライアントにシグナルを送って、クライアントの現在の処理を中断させる方法があります。Oracle Tuxedoシステムでは、ATMI関数が呼び出されるたびに非請求メッセージが到着していないかどうかがデフォルトで確認されます。これは
ディップ・インと呼ばれる方法で、次の利点があります。
クライアントが
tpinit()関数を使用してアプリケーションに参加する場合、フラグを定義して非請求メッセージの処理方法を指定できます。クライアントへの通知では、
表4-2に示す値を
flagsに指定できます。
表4-2
TPINIT型バッファのクライアント通知でのフラグ
|
|
|
シグナルによる任意通知を選択します。このフラグは、シングル・スレッドでシングル・コンテキストのアプリケーションのみで使用します。このモードの利点は、直ちに通知できることです。このモードには、次のような不都合があります。
•
|
ネイティブ・クライアントを実行している場合、呼出し側プロセスで送信元プロセスと同じ UIDを使用する必要があります。(ワークステーション・クライアントには、この制約はありません。)
|
•
|
すべてのプラットフォーム上でTPU_SIGが使用できるわけではありません。特に、MS-DOSワークステーションでは使用できません。
|
システムや環境の要件を満たしていない場合にこのフラグを指定すると、フラグに TPU_DIPが設定され、ログにイベントが記録されます。
|
|
ディップ・インによる任意通知を選択します。クライアントは tpsetunsol()関数を使用してメッセージ処理関数の名前を指定し、 tpchkunsol()関数を使用して待機中の非請求メッセージを確認できます。
|
|
別のスレッド内の THREAD通知を指定します。このフラグは、マルチスレッドをサポートするプラットフォーム専用です。マルチスレッドがサポートされていないプラットフォームで TPU_THREADを指定すると、無効な引数として処理されます。その結果、エラーが返されて tperrno(5)が TPEINVALに設定されます。
|
|
|
TPINIT型バッファ・フラグの詳細は、
『Oracle Tuxedo ATMI C言語関数リファレンス』の
「tpinit(3c)」を参照してください。
アプリケーションは、protectedまたはfastpathのいずれかのモードでOracle Tuxedoシステムにアクセスできます。ATMIクライアントは、
tpinit()関数を使用してアプリケーションに参加するときに、モードをリクエストできます。モードを指定するには、
TPINITバッファの
flagsフィールドにいずれかのモードを指定して、その値を
tpinit()関数に渡します。
表4-3
TPINIT型バッファのシステム・アクセス・フラグ
|
|
|
アプリケーション内でATMI関数を呼び出し、共用メモリーを使用してOracle Tuxedoシステムの内部表にアクセスします。Oracle Tuxedoシステム・ライブラリ外のアプリケーション・コードからのアクセスに対して、共用メモリーを保護します。この値は、 NO_OVERRIDEが指定されている場合を除き、 UBBCONFIGの値に優先します。 UBBCONFIGの詳細は、『Oracle Tuxedoアプリケーションの設定』 を参照してください。
|
|
アプリケーション・コード内で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バッファに格納されて評価されます。
•
|
アプリケーションで認証が必要な場合、次のどちらの認証が行われるか。
|
•
|
アプリケーション・パスワードとユーザー固有の情報に基づくアプリケーション認証
|
通常、クライアントは
tpinit()より先に
tpchkauth()関数を呼び出して、初期化時に指定する必要のあるセキュリティ情報を確認します。
セキュリティのプログラミング手法の詳細は、『Oracle CORBAアプリケーションにおけるセキュリティの使用』
を参照してください。
ATMIクライアントがすべてのサービスをリクエストして、それに対する応答を受信したら、
tpterm(3c)関数を使用してアプリケーションから分離できます。
tpterm()関数には引数がなく、エラー時には
–1を返します。
実行可能ATMIクライアントをビルドするには、
buildclient(1)コマンドを実行して、Oracle Tuxedoシステム・ライブラリとその他のすべての参照ファイルを使用してアプリケーションをコンパイルします。次は、
buildclientコマンドの構文です。
buildclient
filename.c -o
filename -f
filenames -l
filenames
表4-4は、
buildclientコマンドのオプションを示しています。
|
|
|
|
|
実行可能な出力ファイル。出力ファイルのデフォルト名は a.outです。
|
|
Oracle Tuxedoシステムのライブラリより先にリンクされるファイルのリスト。 -fオプションは、コマンド行で複数回指定したり、各 -fに複数のファイル名を指定できます。Cプログラム・ファイル( file.c)を指定すると、リンクされる前にコンパイルが行われます。他のオブジェクト・ファイル( file.o)を個別に指定したり、アーカイブ・ファイル( file.a)にまとめて指定することもできます。
|
|
Oracle Tuxedoシステム・ライブラリの後にリンクされるファイルのリスト。 -lオプションは、コマンド行で複数回指定したり、各 -lに複数のファイル名を指定できます。Cプログラム・ファイル( file.c)を指定すると、リンクされる前にコンパイルが行われます。他のオブジェクト・ファイル( file.o)を個別に指定したり、アーカイブ・ファイル( file.a)にまとめて指定することもできます。
|
|
実行可能サーバーにリンクされるリソース・マネージャのアクセス・ライブラリ。アプリケーション管理者は、 buildtms(1)コマンドを使用して、すべての有効なリソース・マネージャ情報を $TUXDIR/updataobj/RMファイルに事前に定義しておく必要があります。指定できるリソース・マネージャは1つだけです。詳細は、 『Oracle Tuxedoアプリケーションの設定』を参照してください。
|
注意:
|
Oracle Tuxedoライブラリは自動的にリンクされます。コマンド行にOracle Tuxedoライブラリを指定する必要はありません。
|
リンクの編集は
buildclientコマンドを実行して行う必要があります。
リンクするライブラリ・ファイルの指定順序は重要です。関数を呼び出す順序と、それらの関数への参照を含むライブラリによって、この順序が決定されます。
デフォルトでは、
buildclientコマンドはUNIXの
ccコマンドを呼び出します。環境変数
CCを指定して別のコンパイル・コマンドを指定したり、
CFLAGSを指定してコンパイル・フェーズやリンク・フェーズにフラグを設定することができます。詳細は、
3-5ページの「環境変数の設定」を参照してください。
buildclient -C -o audit -f audit.o
次のコマンド行の例では、Cプログラム
audit.cをコンパイルして、実行可能ファイル
auditを生成しています。
buildclient ���o audit ���f audit.
c
リスト4-2に示す次の擬似コードは、通常のATMIクライアント・プロセスがアプリケーションに参加してから分離するまでの処理を示しています。
リスト4-2
通常のクライアント・プロセスのパラダイム
main
()
{
check level of security
call tpsetunsol() to name your handler for TPU_DIP
get usrname, cltname
prompt for application password
allocate a TPINIT buffer
place values into TPINIT buffer structure members
if (tpinit((TPINIT *) tpinfo) == -1){
error routine;
}
allocate a message buffer
while user input exists {
place user input in the buffer
make a service call
receive the reply
check for unsolicited messages
}
free buffers
. . .
if (tpterm() == -1){
error routine;
}
}
エラーが発生すると
-1が返され、アプリケーションが外部グローバル変数
tperrnoにエラーの原因を示す値を設定します。
tperrnoは、
atmi.hヘッダー・ファイルに定義されています。詳細については、
『ファイル形式、データ記述、MIBおよびシステム・プロセス・リファレンス』の
「tperrno(5)」を参照してください。通常、プログラマが発生したエラーの種類を示すエラー・コードをこのグローバル変数に設定します。
tperrnoの値については、
11-1ページの「システム・エラー」を参照してください。各ATMI呼出しで返される全エラー・コードのリストについては、
『Oracle Tuxedo ATMI C言語関数リファレンス』の
C言語アプリケーション・トランザクション・モニター・インタフェースに関する項を参照してください。
#include <stdio.h> /* UNIX */
#include <string.h> /* UNIX */
#include <fml.h> /* BEA Tuxedo System */
#include <atmi.h> /* BEA Tuxedo System */
#include <Uunix.h> /* BEA Tuxedo System */
#include <userlog.h> /* BEA Tuxedo System */
#include "bank.h" /* BANKING #defines */
#include "aud.h" /* BANKING view defines */
...
main(argc, argv)
int argc;
char *argv[];
{
...
if (strrchr(argv[0],'/') != NULL)
proc_name = strrchr(argv[0],'/')+1;
else
proc_name = argv[0];
...
/* Join application */
if (tpinit((TPINIT *) NULL) == -1) {
(void)userlog("%s: failed to join application\n", proc_name);
exit(1);
}
...
/* Leave application */
if (tpterm
() == -1) {
(void)userlog("%s: failed to leave application\n", proc_name);
exit(1);
}
}
この例は、
tpinit()を呼び出すことによって、アプリケーションに参加しているクライアント・プロセスを示しています。エラー(戻り値が
–1)が発生すると、このプロセスはCプログラム文の
printf()と似た引数を取る
userlog()を呼び出して、中央イベント・ログにメッセージを書き込みます。詳細は、
『Oracle Tuxedo ATMI C言語関数リファレンス』の
「userlog(3c)」を参照してください。
同様に、
tpterm()を呼び出し、エラーが発生すると、このプロセスは中央イベント・ログにメッセージを書き込みます。