![]() |
![]() |
|
|
システムで提供されるサーバおよびサービス
main() ルーチンは、システムで提供される 1 つのサーバ AUTHSVR、および 2 つのサブルーチン tpsvrinit() と tpsvrdone() を提供します。これらの 3 つのデフォルト・バージョンについては、以降の節で説明します。これらのサーバとサブルーチンは、ご使用のアプリケーションに合わせて変更することができます。
注記 tpsvrinit() と tpsvrdone() を独自にコーディングする場合、この 2 つのルーチンのデフォルト・バージョンが、それぞれ tx_open() と tx_close() を呼び出すことに注意してください。tx_open() ではなく tpopen() を呼び出す tpsvrinit() の新しいバージョンをコーディングする場合は、tpclose() を呼び出す tpsvrdone() もコーディングする必要があります。つまり、この 2 つの関数が呼び出すオープンとクローズの関数は対になっていなければなりません。
ここで説明するサブルーチンのほかに、tpsvrthrinit(3c) と tpsvrthrdone(3c) の 2 つのサブルーチンがシステムで提供されています。詳細については、「マルチスレッドおよびマルチコンテキスト・アプリケーションのプログラミング」を参照してください。
システムで提供されるサーバ: AUTHSVR( )
AUTHSVR(5) を使用すると、アプリケーションで各クライアントの認証を行うことができます。このサーバは、アプリケーションのセキュリティ・レベルが TPAPPAUTH に設定されている場合に、tpinit() によって呼び出されます。
AUTHSVR のサービスは、TPINIT 型バッファの data フィールドでユーザ・パスワードを確認します。このユーザ・パスワードは、TPINIT 型バッファの passwd フィールドにあるアプリケーション・パスワードとは異なります。デフォルトでは、システムによって data から文字列が取得され、それと合致する文字列が /etc/passwd ファイルで検索されます。
tpinit() がネイティブ・サイトのクライアントから呼び出された場合、受信した data フィールドはそのまま転送されます。そのため、アプリケーションでパスワードの暗号化が必要な場合、それに応じてクライアント・プログラムをコーディングする必要があります。
tpinit() がワークステーション・クライアントから呼び出された場合、データは暗号化されてからネットワークに送信されます。
システムで提供されるサービス:tpsvrinit( ) 関数
サーバの起動時に、BEA Tuxedo システムの main() はその初期化時、つまりサービス要求の処理を開始する前に、tpsvrinit(3c) を呼び出します。
アプリケーションがこの関数のカスタム・バージョンをサーバに提供していない場合、main() で提供されるデフォルトの関数が呼び出されます。この関数は、リソース・マネージャをオープンし、エントリを中央イベント・ログに記録してサーバの起動が成功したことを示します。中央ユーザ・ログは自動的に生成されるファイルで、userlog(3c) を呼び出して、プロセスがこのファイルにメッセージを書き込みます。中央イベント・ログの詳細については、「エラーの管理」を参照してください。
tpsvrinit() 関数を使用すると、アプリケーションで要求される次のような初期化プロセスを行うことができます。
以降の節では、tpsvrinit() を呼び出すことによって、これらの初期化プロセスがどのように行われるのかをコード例で示します。以下のコード例では示していませんが、このルーチン内ではメッセージ交換を行うこともできます。ただし、非同期応答が未処理のままで tpsvrinit() 関数が制御を戻すと、この関数は失敗します。その場合、BEA Tuxedo システムでは応答は無視されて、サーバが正常に終了します。
また、tpsvrinit() 関数で、トランザクションを開始したり終了することができます。「エラーの管理」を参照してください。
tpsvrinit() 関数の呼び出しには、次の文法を使用します。
int
tpsvrinit(int argc, char **argv)
コマンド行オプションの取得
サーバは、起動時に最初の処理として、コンフィグレーション・ファイルに指定されているサーバ・オプションを EOF まで読み取ります。その場合、サーバは UNIX 関数 getopt(3) を呼び出します。コマンド行に 2 つのダッシュ (--) が出現した時点で、getopt() 関数は EOF を返します。getopt 関数は、次に処理する引数の argv インデックスを外部変数 optind に設定します。その後、定義済み main() 関数が tpsvrinit() を呼び出します。
次のコード例は、tpsvrinit() 関数でコマンド行オプションを取得する方法を示しています。
tpsvrinit() を使用したコマンド行オプションの取得
tpsvrinit(argc, argv)
int argc;
char **argv;
{
int c;
extern char *optarg;
extern int optind;
.
.
.
while((c = getopt(argc, argv, "f:x:"))!= EOF)
switch(c){
.
.
.
}
.
.
.
}
main() は tpsvrinit() を呼び出すときに、コマンド行の 2 つのダッシュ (--) の後にある引数を使用します。前述の例では、f と x オプションは、コロンで区切られていることからわかるようにそれぞれ引数を取ります。optarg は、オプション引数の先頭を指しています。switch 文のロジックは省略してあります。
リソース・マネージャのオープン
tpsvrinit() 関数のもう 1 つの使用法として、リソース・マネージャをオープンすることができます。BEA Tuxedo システムには、リソース・マネージャをオープンする関数として、tpopen(3c) と tx_open(3c) があります。また、これらと対の関数として、tpclose(3c) と tx_close(3c) があります。これらの関数を呼び出してリソース・マネージャをオープンしたりクローズするアプリケーションは、その意味では移植性があります。これらのアプリケーションは、コンフィギュレーション・ファイルに設定されたリソース・マネージャのインスタンス固有の情報にアクセスすることによって動作します。
注記 マルチスレッド・サーバのコーディングでは、tpsvrthrinit() 関数を使用して、リソース・マネージャをオープンする必要があります。「マルチスレッドおよびマルチコンテキスト・アプリケーションのプログラミング」を参照してください。
これらの関数呼び出しは省略可能です。また、リソース・マネージャがデータベースの場合、リソース・マネージャ固有の呼び出しがデータ操作言語 (DML) の一部であるときは、その呼び出しの代わりに使用できます。userlog(3c) 関数を使用して、中央イベント・ログに書き込んでいることに注目してください。
注記 コマンド行オプションを受け取り、データベースをオープンする初期化関数を作成するには、次のコード例と前述のコード例を組み合わせます。
tpsvrinit() を使用したリソース・マネージャのオープン
tpsvrinit()
{
/* データベースのオープン */
if (tpopen() == -1) {
(void)userlog("tpsvrinit:failed to open database: ");
switch (tperrno) {
case TPESYSTEM:
(void)userlog("System error\n");
break;
case TPEOS:
(void)userlog("Unix error %d\n",Uunixerr);
break;
case TPEPROTO:
(void)userlog("Called in improper context\n");
break;
case TPERMERR:
(void)userlog("RM failure\n");
break;
}
return(-1); /* サーバの終了 */
}
return(0);
}
初期化時にエラーが発生しないように、サーバを終了してからサービス要求の処理を開始するように tpsvrinit() 関数をコーディングできます。
システムで提供されるサービス:tpsvrdone( ) 関数
tpsvrinit() が tpopen() を呼び出してリソース・マネージャをオープンするのと同じように、tpsvrdone() 関数は tpclose() を呼び出してリソース・マネージャをクローズします。
注記 マルチスレッド・サーバのコーディングでは、tpsvrthrdone() コマンドを使用して、リソース・マネージャをクローズする必要があります。「マルチスレッドおよびマルチコンテキスト・アプリケーションのプログラミング」を参照してください。
tpsvrdone() 関数の呼び出しには、次の文法を使用します。
void
tpsvrdone() /* サーバ終了ルーチン */
tpsvrdone() 関数に引数は必要ありません。
アプリケーションに tpsvrdone() 関数のクローズ用ルーチンが定義されていない場合、main() で提供されるデフォルトのルーチンが BEA Tuxedo システムによって呼び出されます。このルーチンは、tx_close() と userlog() を呼び出してリソース・マネージャをクローズし、中央イベント・ログへに書き込みます。ログには、サーバが間もなく終了することを伝えるメッセージが書き込まれます。
tpsvrdone() 関数は、サーバがサービス要求の処理を終了した後、サーバが終了する前に呼び出されます。その場合、サーバはまだシステムの一部なので、特定の規則に従っている限り、ルーチン内でさらに通信およびトランザクションが行われる場合があります。これらの規則については、「エラーの管理」を参照してください。
次のコード例は、tpsvrdone() 関数を使用して、リソース・マネージャをクローズして終了する方法を示しています。
tpsvrdone() を使用したリソース・マネージャのクローズ
void
tpsvrdone()
{
/* データベースのクローズ */
if(tpclose() == -1)
(void)userlog("tpsvrdone:failed to close database: ");
switch (tperrno) {
case TPESYSTEM:
(void)userlog("BEA TUXEDO error\n");
break;
case TPEOS:
(void)userlog("Unix error %d\n",Uunixerr);
break;
case TPEPROTO:
(void)userlog("Called in improper context\n");
break;
case TPERMERR:
(void)userlog("RM failure\n");
break;
}
return;
}
return;
}
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|