|
|
クライアントでのマルチスレッドとマルチコンテキストの動作
マルチスレッドおよびマルチコンテキスト・アプリケーションがアクティブの場合、クライアントのライフ・サイクルは次の 3 つのフェーズから構成されます。
起動フェーズ
起動フェーズでは、次の操作が行われます。
注記 BEA Tuxedo システムから独立して動作するスレッドが存在する場合もあります。ここでは、そのようなスレッドについては説明していません。
クライアント・スレッドの複数コンテキストへの参加
BEA Tuxedo マルチコンテキスト・アプリケーションのクライアントは、次の規則に従う限り、複数のアプリケーションに対応付けることができます。
クライアントが複数のコンテキストに参加するには、TPINFO データ型の flags に TPMULTICONTEXTS フラグを設定して、tpinit() 関数を呼び出します。
TPMULTICONTEXTS フラグを設定して tpinit() 関数が呼び出されると、アプリケーションとの新しい対応付けが生成され、スレッドに対するカレントの対応付けが指定されます。新しい対応付けが生成される BEA Tuxedo ドメインは、TUXCONFIG または WSENVFILE/WSNADDR 環境変数の値で決定されます。
クライアント・スレッドの既存のコンテキストへの切り替わり
多くの ATMI 関数はコンテキスト単位で動作します。このような ATMI 関数のリストについては、「マルチスレッド・クライアントでのコンテキスト単位の関数とデータ構造体」を参照してください。コンテキスト単位で動作するには、ターゲット・コンテキストが現在のコンテキストであることが必要です。クライアントは複数のコンテキストに参加できますが、状況とスレッドにかかわらず現在のコンテキストになることができるコンテキストは 1 つだけです。
アプリケーション内でタスクの優先順位が移り、ほかの BEA Tuxedo ドメインと通信する必要が発生した場合、あるコンテキストから別のコンテキストにスレッドを再割り当てした方がよい場合があります。
そのような場合、あるクライアント・スレッドが tpgetctxt(3c) を呼び出し、返された現在のコンテキストを値として持つハンドルを別のクライアント・スレッドに渡します。2 番目のスレッドは tpsetctxt(3c) を呼び出し、最初のスレッドで tpgetctxt(3c) から受け取ったハンドルを指定して、現在のコンテキストとの対応付けを確立します。
目的のコンテキストとの対応付けが確立されると、2 番目のスレッドはコンテキスト単位で動作する ATMI 関数を使用してタスクを実行できるようになります。詳細については、「マルチスレッド・クライアントでのコンテキスト単位の関数とデータ構造体」を参照してください。
作業フェーズ
このフェーズでは、各スレッドによって処理が行われます。次は、行われる処理の例です。
サービス要求
スレッドは、同期要求の場合は tpcall()、非同期要求の場合は tpacall() を呼び出して、サーバに要求を送ります。tpcall() で要求を送った場合、以降操作を行わなくても応答を受け取ることができます。
サービス要求に対する応答
tpcall() でサービスの非同期要求を送った場合、同じコンテキスト内のスレッドは tpgetrply() を呼び出して応答を受け取ります。このスレッドは、要求を送ったスレッドと同じスレッドではない場合もあります。
トランザクション
あるスレッドがトランザクションを開始すると、そのスレッドのコンテキストを共有するすべてのスレッドでそのトランザクションが共有されます。
コンテキスト内の多くのスレッドでトランザクションに関する処理が行われますが、トランザクションをコミットまたはアボートできるのは 1 つのスレッドだけです。トランザクションをコミットまたはアボートするスレッドは、トランザクションを開始したスレッドである必要はなく、トランザクションを処理しているどのスレッドでもかまいません。スレッド・アプリケーションでは、通常のトランザクション規則に従うために、適切に同期を行う必要があります。たとえば、未終了の RPC 呼び出しや会話がある場合に、トランザクションをコミットすることはできません。また、トランザクションがコミットまたはアボートされた後で、そのトランザクションに対する呼び出しを行うことはできません。プロセスは、アプリケーションの各対応付けに対して、1 つのトランザクションの一部にだけなることができます。
アプリケーションの 1 つのスレッドが tpcommit() を呼び出し、それと同時に別のスレッドが RPC 呼び出しまたは会話型呼び出しを行うと、これらの呼び出しは特定の順序で呼び出されたものとして処理されます。アプリケーション・コンテキストは、シングルスレッド・プログラムとシングルコンテキスト・プログラムに対する制約と同じ制約に従って、tpsuspend() を呼び出してトランザクションを一時的に中断し、別のトランザクションを開始します。
任意通知型メッセージ
マルチスレッド・アプリケーションまたはマルチコンテキスト・アプリケーションの各コンテキストでは、任意通知型メッセージを次の 3 種類のいずれかの方法で処理できます。
処理方法 |
設定 |
---|---|
任意通知型メッセージの無視 |
TPU_IGN |
ディップ・イン通知 |
TPU_DIP |
専用のスレッド通知 |
TPU_THREAD |
以下の事柄に注意してください。
イベントの即時通知を受け取る必要がある場合は、そのプラットフォームでマルチコンテキストを使用するかどうかを慎重に検討します。
専用のスレッド通知の場合、任意通知型メッセージの受信と、任意通知型メッセージ・ハンドラのディスパッチに別々のスレッドが使用されます。あるコンテキストで一度に実行できる任意通知型メッセージ・ハンドラは 1 つだけです。
スレッドがサポートされていない BEA Tuxedo システム用プラットフォームで tpinit() が呼び出された場合に、スレッドがサポートされていないプラットフォーム上で TPU_THREAD 通知が要求されたことを示すパラメータが指定されていると、tpinit() は -1 を返して tperrno に TPEINVAL を設定します。UBBCONFIG(5) のデフォルトの NOTIFY オプションが THREAD に設定されている場合に、特定のマシンでスレッドを利用できないと、そのマシンのデフォルトの機能は DIPIN になります。このような動作の相違があるので、スレッドがサポートされているマシンとサポートされていないマシンが混在する環境では、管理者はすべてのマシンにデフォルトを指定できます。ただし、そのマシンで利用できない機能をクライアントが明示的に要求することはできません。
tpsetunsol() がコンテキストに対応付けされていないスレッドから呼び出されると、新しく生成されるすべての tpinit() コンテキストに対して、プロセス単位のデフォルトの任意通知型メッセージ・ハンドラが作成されます。特定のコンテキストは、コンテキストがアクティブのときに tpsetunsol() を再度呼び出して、そのコンテキストの任意通知型メッセージ・ハンドラを変更することができます。プロセス単位のデフォルトの任意通知型メッセージ・ハンドラは、コンテキストに現在対応付けされていないスレッドで tpsetunsol() を再度呼び出すと、変更できます。
プロセスが同じアプリケーションと複数の対応付けを持つ場合、各対応付けに異なる CLIENTID を割り当てられ、任意通知型メッセージを特定のアプリケーションとの対応付けに送信できるようになります。プロセスが同じアプリケーションと複数の対応付けを持つ場合、ブロードキャスト基準を満たすアプリケーションの各対応付けに任意の tpbroadcast() が別々に送信されます。任意通知型メッセージを受信する場合のディップ・イン・チェックでは、カレントのアプリケーションとの対応付けに送信されるメッセージだけが対象となります。
任意通知型メッセージ・ハンドラでは ATMI 関数を利用できるほか、任意通知型メッセージ・ハンドラ内で tpgetctxt(3c) を呼び出すことができます。そのため、任意通知型メッセージ・ハンドラは別のスレッドを生成して、同じコンテキスト内で必要となる実質的な ATMI 作業を行うことができるようになります。
ユーザ・ログで保持されるスレッド固有の情報
userlog(3c) を使用すると、各アプリケーション内の各スレッドに対して次の識別情報が記録されます。
process_ID.thread_ID.context_ID
スレッドがサポートされていないプラットフォームやシングルコンテキスト・アプリケーションに対しては、thread_ID フィールドと context_ID フィールドにプレースホルダが出力されます。
TM_MIB(5) では、この機能は T_ULOG クラスの TA_THREADID フィールドと TA_CONTEXTID フィールドでサポートされています。
完了フェーズ
このフェーズでは、クライアント・プロセスの終了時に、カレントのコンテキストおよび対応付けられたすべてのスレッドに代わって 1 つのスレッドが tpterm() を呼び出してそのアプリケーションとの対応付けを終了します。ほかの ATMI 関数と同じように、tpterm() は現在のコンテキストに対して処理を行います。tpterm() は、終了するコンテキストに対応付けされたすべてのスレッドに影響し、これらのスレッドで共有されるすべてのコンテキストを終了します。
良く設計されたアプリケーションでは、特定のコンテキスト内のすべての処理が完了してから tpterm() が呼び出されます。tpterm() が呼び出される前に、すべてのスレッドが同期していなければなりません。
関連項目
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|