BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedo ホーム   |   C 言語を使用した BEA Tuxedo アプリケーションのプログラミング   |   先頭へ   |   前へ   |   次へ   |   目次

 


クライアントでマルチコンテキストを使用するためのコーディング

クライアントでマルチコンテキストを使用するには、次の内容をコーディングします。

アプリケーションでトランザクションを使用する場合、トランザクションのマルチコンテキストの結果についても注目します。詳細については、「マルチスレッドおよびマルチコンテキスト・アプリケーションにおけるトランザクションのコーディング規則」を参照してください。

注記 この節で示す手順とコード例は、BEA Tuxedo システムで提供される C 言語のライブラリ関数を参照します。それらに相当する COBOL ライブラリ関数も利用できます。詳細については、『BEA Tuxedo COBOL リファレンス』を参照してください。

コンテキストの属性

コンテキストを使用する場合、コーディングで以下の事柄に注意してください。

初期化時のマルチコンテキストの設定

クライアントがアプリケーションに参加する準備ができたら、次のコード例に示すように、TPMULTICONTEXTS フラグを設定して tpinit() を指定します。

クライアントのマルチコンテキスト・アプリケーションへの参加

#include <stdio.h>
#include <atmi.h>

TPINIT * tpinitbuf;

main()
{
tpinitbuf = tpalloc(TPINIT, NULL, TPINITNEED(0));

tpinitbuf->flags = TPMULTICONTEXTS;
.
.
.
if (tpinit (tpinitbuf) == -1) {
           ERROR_PROCESSING_CODE
}
.
.
.
}

新しいアプリケーションとの対応付けが生成され、TUXCONFIG または WSENVFILE/WSNADDR 環境変数で指定された BEA Tuxedo ドメインに割り当てられます。

注記 1 つのプロセスでは、tpinit() へのすべての呼び出しに TPMULTICONTEXTS フラグを含めるか、または tpinit() へのすべての呼び出しにこのフラグを含めません。この規則には、例外が 1 つあります。つまり、tpterm() への呼び出しが正常に終了して、クライアントのすべてのアプリケーション対応付けが終了した場合、次に tpinit() を呼び出すときに必ずしも TPMULTICONTEXTS フラグを含む必要のない状態にプロセスが復元されます。

マルチコンテキスト・クライアントのセキュリティのインプリメント

同じプロセス内の各アプリケーションとの対応付けには、別個にセキュリティ検査を行う必要があります。検査の内容は、アプリケーションで使用されているセキュリティ・メカニズムのタイプによって異なります。たとえば、BEA Tuxedo アプリケーションでは、システム・レベルのパスワードまたはアプリケーション・パスワードを使用します。

マルチコンテキスト・アプリケーションのプログラマは、アプリケーションで使用するセキュリティのタイプを決定し、そのセキュリティをプロセス内の各アプリケーションとの対応付けにインプリメントします。

クライアント終了前のスレッドの同期

クライアントをアプリケーションから切断する準備ができたら、tpterm() を呼び出します。ただし、マルチコンテキスト・アプリケーションでは、tpterm() を呼び出すと現在のコンテキストが破棄されることに注目してください。その場合、現在のコンテキストで動作しているすべてのスレッドが影響を受けます。アプリケーション・プログラマは、tpterm() が不意に呼び出されることがないように、複数のスレッドを使用する場合は注意してください。

まだ動作中のスレッドがあるコンテキストでは、tpterm() を呼び出さないようにします。そのような状況で tpterm() を呼び出すと、そのコンテキストと対応付けられていたほかのスレッドが特別な無効コンテキスト状態になります。無効コンテキスト状態では、大部分の ATMI 関数を使用できなくなります。無効コンテキスト状態からスレッドを解放するには、tpsetctxt(3c) または tpterm() を呼び出します。良く設計されたアプリケーションでは、無効コンテキスト状態が生じることはありません。

注記 BEA Tuxedo システムでは、COBOL アプリケーションのマルチスレッドはサポートされていません。

コンテキストの切り替え

次は、2 つのコンテキストからサービスを呼び出すクライアントで行われる処理の手順をまとめたものです。

  1. TUXCONFIG 環境変数に firstapp で必要な値を設定します。

  2. TPMULTICONTEXTS フラグを設定して tpinit() を呼び出し、最初のアプリケー ションに参加します。

  3. tpgetctxt(3c) を呼び出して、現在のコンテキストへのハンドルを取得します。

  4. tuxputenv() を呼び出して、TUXCONFIG 環境変数の値を secondapp コンテキ ストに必要な値に切り替えます。

  5. TPMULTICONTEXTS フラグを設定して tpinit() を呼び出して、2 番目のアプリ ケーションに参加します。

  6. tpgetctxt(3c) を呼び出して、現在のコンテキストへのハンドルを取得します。

  7. tpsetctxt(3c) を呼び出して、firstapp コンテキストからコンテキストの切 り替えを開始します。

  8. firstapp サービスを呼び出します。

  9. tpsetctxt(3c) を呼び出してクライアントを secondapp コンテキストに切り替 え、secondapp サービスを呼び出します。

  10. tpsetctxt(3c) を呼び出してクライアントを firstapp コンテキストに切り替 え、firstapp サービスを呼び出します。

  11. tpterm() を呼び出して、firstapp コンテキストを終了します。

  12. tpsetctxt(3c) を呼び出してクライアントを secondapp コンテキストに切り替 え、secondapp サービスを呼び出します。

  13. tpterm() を呼び出して、secondapp コンテキストを終了します。

次のコード例は、この手順を示しています。

注記 コードを簡単にするために、エラー・チェックは省略してあります。

クライアントでのコンテキストの切り替え

#include <stdio.h> 
#include "atmi.h"/* BEA Tuxedo ヘッダ・ファイル */ 
 
#if defined(__STDC__) || defined(__cplusplus) 
main(int argc, char *argv[]) 
#else 
main(argc, argv) 
int argc; 
char *argv[]; 
#endif 
{ 
 
TPINIT * tpinitbuf; 
TPCONTEXT_T firstapp_contextID, secondapp_contextID; 
/* TUXCONFIG が /home/firstapp/TUXCONFIG に設定されていることを前提とします。*/ 
/*  
* BEA Tuxedo システムにマルチコンテキスト・モードで接続します。 
*/ 
tpinitbuf=tpalloc(TPINIT, NULL, TPINITNEED(0)); 
tpinitbuf->flags = TPMULTICONTEXTS; 
 
if (tpinit((TPINIT *) tpinitbuf) == -1) { 
(void) fprintf(stderr, "Tpinit failed\n"); 
exit(1); 
} 
 
/* 
* 現在のコンテキストへのハンドルを取得します。 
*/ 
tpgetctxt(&firstapp_contextID, 0); 
 
/* 
* tuxputenv を使用して TUXCONFIG の値を変更し、 
* 別のアプリケーションに参加 (tpinit) します。 
*/ 
tuxputenv("TUXCONFIG=/home/second_app/TUXCONFIG"); 
 
/* 
* secondapp に参加 (tpinit) します。
*/ 
if (tpinit((TPINIT *) tpinitbuf) == -1) { 
(void) fprintf(stderr, "Tpinit failed\n"); 
exit(1); 
} 
 
/* 
* secondapp のコンテキストへのハンドルを取得します。 
*/ 
tpgetctxt(&secondapp_contextID, 0); 
 
/* 
* tpgetctxt から取得したハンドルと tpsetctxt を使用して、 
* 2 つのコンテキスト間で切り替えができます。firstapp から開始します。
*/ 
 
tpsetctxt(firstapp_contextID, 0); 
 
/* 
* firstapp で提供されるサービスを呼び出し、次に secondapp に切り替えます。 
*/ 
 
tpsetctxt(secondapp_contextID, 0); 
 
/* 
* secondapp で提供されるサービスを呼び出します。
* 次に firstapp に戻ります。
*/ 
 
tpsetctxt(firstapp_contextID, 0); 
 
/* 
* firstapp で提供されるサービスを呼び出します。操作が終了したら
* firstapp のコンテキストを終了します。
*/ 
 
tpterm(); 
 
/* 
* secondapp に戻ります。
*/ 
 
tpsetctxt(secondapp_contextID, 0); 
/* 
* secondapp で提供されるサービスを呼び出します。操作が終了したら
* secondapp のコンテキストを終了し、プログラムを終了します。
*/ 
 
tpterm(); 
 
return(0); 
}

任意通知型メッセージの処理

任意通知型メッセージを処理する各コンテキストでは、任意通知型メッセージ・ハンドラを設定するか、またはプロセス・ハンドラのデフォルトが設定されている場合はそれを使用する必要があります。

tpsetunsol() がコンテキストに対応付けされていないスレッドから呼び出されると、新しく生成されるすべての tpinit() コンテキストに対して、プロセス単位のデフォルトの任意通知型メッセージ・ハンドラが作成されます。特定のコンテキストは、コンテキストがアクティブのときに tpsetunsol() を再度呼び出して、そのコンテキストの任意通知型メッセージ・ハンドラを変更することができます。プロセス単位のデフォルトの任意通知型メッセージ・ハンドラは、コンテキストに現在対応付けされていないスレッドで tpsetunsol() を再度呼び出すと、変更できます。

ハンドラの設定は、シングルスレッド・アプリケーションまたはシングルコンテキスト・アプリケーションのハンドラを設定する場合と同じように行います。詳細については、tpsetunsol() を参照してください。

現在処理を行っているコンテキストを識別するには、任意通知型メッセージ・ハンドラ内で tpgetctxt(3c) を使用します。

マルチスレッドおよびマルチコンテキスト・アプリケーションにおけるトランザクションのコーディング規則

トランザクションを使用する場合、コーディングで以下の事柄に注意してください。

関連項目

 

先頭へ戻る 前のトピックへ 次のトピックへ