•
• Oracle Tuxedoソフトウェアを使用すると、リクエストごとのスレッド・モデルとオブジェクトごとのスレッド・モデルのいずれかを実装できます。各モデルについては、4-5ページの「スレッド・モデル」で説明します。
•
•
注意: リエントラント・サーバント・メカニズムは、PER_REQUEST同時実行性戦略が指定された状態でサーバーが起動した場合にのみ使用可能です。このメソッドの使用方法は、『CORBAプログラミング・リファレンス』を参照してください。Oracle Tuxedo製品は、OMG発行のORB Portability仕様によって定義されているマルチスレッド・モデルに準拠しています。この仕様は、OMG CORBA仕様に組み込まれています。Oracle Tuxedo製品では、CORBA::Currentから継承されたインタフェースの操作は、Currentオブジェクトが取得されたスレッドに関連付けられている状態ではなく、操作が呼び出されるスレッドに関連付けられている状態にアクセスできます。この振る舞いの理由は次の2つです。たとえば、アプリケーションがあるスレッドから別のスレッドにトランザクションを受け渡す場合、そのアプリケーションはCosTransactions::Currentオブジェクトを使用できません。かわりに、アプリケーションはほかのスレッドにCosTransactions::Controlオブジェクトを受け渡します。CosTransctions::Currentオブジェクトを受け渡すと、受信側のスレッドはそのスレッドに関連付けられているトランザクション状態だけにアクセスできます。
• 次のORBメソッド・セットは、スレッド管理の要件を満たします。これらのメソッドを、まとめてコンテキスト・サービスと呼びます。オブジェクトはスレッドを作成するときにORBでこの操作を呼び出して、オブジェクトがスレッドに渡すことができるシステム・コンテキスト情報を取得します。この操作は、すでにコンテキストを持っているスレッドから呼び出される必要があります。たとえば、メソッドがディスパッチされたスレッドはすでにコンテキストを持っています。この操作の使用方法は、『CORBAプログラミング・リファレンス』のORB::get_ctx()に関する項を参照してください。オブジェクトがスレッドを作成すると、そのスレッドは通常get_ctxメソッドを呼び出したスレッドからコンテキスト情報を取得します。作成されたスレッドは、ORB::set_ctxを呼び出してそのスレッドが動作する必要があるシステム・コンテキストを設定するときに、そのコンテキスト情報を使用します。この操作の使い方については、『CORBAプログラミング・リファレンス』の「ORB::set_ctx()」を参照してください。作成されたスレッドは、処理を完了するとこのメソッドを呼び出して自身とシステム・コンテキストとの関連付けを解除します。この操作の使用方法は、『CORBAプログラミング・リファレンス』のORB::clear_ctx()に関する項を参照してください。スレッドは、処理を完了するとこのメソッドを呼び出して、Oracle Tuxedoシステムにアプリケーション管理スレッドに関連付けられているリソースを解放できることを通知します。この操作の使用方法は、『CORBAプログラミング・リファレンス』のORB::inform_thread_exit()に関する項を参照してください。
• ServerBaseクラスServerBaseクラスのデフォルト実装をオーバーライドするために、アプリケーション開発者はServerBaseから導出したクラスを作成できます。すでにサポートされているServerBaseメソッドの他にも、次のメソッドがマルチスレッド・サーバー・アプリケーションの実装をサポートします。これらのメソッドを使用すると、アプリケーションのマルチスレッド特性を細かく制御できます。これらのメソッドの使用方法は、『CORBAプログラミング・リファレンス』のServerBaseクラスに関する項を参照してください。
•
•
• Oracle Tuxedo CORBAのスレッド・サポートのデフォルトの動作は、シングル・スレッド・サーバー・サポート環境をエミュレートすることです。マルチスレッド環境でシングル・スレッドCORBAアプリケーションを実行する場合は、サーバー・アプリケーション・コードと構成ファイルを変更する必要はありません。ただし、既存のシングル・スレッド・アプリケーションを実行する前に、buildobjserverコマンドとbuildobjclientコマンドを使用してそのアプリケーションを再ビルドする必要があります。サーバー・アプリケーションのマルチスレッドを有効化しなかった場合、そのアプリケーションはシングル・スレッド・サーバーとして動作します。buildobjserverコマンドによって生成されるサーバー・アプリケーションは、適切なプラットフォーム固有のコンパイラ設定を使用してコンパイルされ、適切なプラットフォーム固有のスレッド・サポート・ライブラリを使用してリンクされます。これにより、Oracle Tuxedoソフトウェアが提供する共有ライブラリとの互換性が保証されます。マルチスレッドをサポートするCORBAサーバー・アプリケーションを作成する場合は、アプリケーションをビルドするときにbuildobjserverコマンドで-tオプションを指定する必要があります。実行時に、Oracle Tuxedoシステムは、実行可能プログラムと、CORBAサーバー・アプリケーションの構成ファイルUBBCONFIGで選択されたスレッド・モデルとの互換性を検証します。UBBCONFIGファイルでスレッド・モデルを設定する方法は、4-36ページの「UBBCONFIGファイルの例」を参照してください。
注意: CORBAサーバー・アプリケーションのビルド時に-tを指定する場合、UBBCONFIGファイルのMAXDISPATCHTHREADSパラメータを1より大きい値に設定する必要があります。それ以外の値を設定すると、CORBAサーバー・アプリケーションはシングル・スレッド・サーバーとして動作することになります。ServerBaseクラスから継承された独自のServerクラスを実装する場合は、buildobjserverコマンドで-bオプションを使用してその代替Serverクラスを指定する必要があります。buildobjserverコマンドは、次の構文で-bオプションをサポートしています。buildobjserver [-v] [-o outfile] [-f {firstfiles|@def-file}]
[-l {lastfiles|@def-file}] [-r rmname] [-b bootserverclass] [-t]前述の構文で、bootserverclassの値は、CORBAサーバー・アプリケーションの起動時に使用されるC++クラスを指定します。-bオプションを指定しない場合、Oracle TuxedoシステムはServerという名前でクラスのインスタンスを作成します。-bオプションを指定する場合、Tuxedoシステムは代替サーバー・クラスのメイン関数を作成し、プロジェクトは-bオプションで指定したbootserverclassの名前を持つヘッダー・ファイルを提供する必要があります。ヘッダー・ファイルには、代替C++クラスの定義が含まれます。この代替Serverクラスは、ServerBaseクラスから継承される必要があります。たとえば、コマンド行で-b AslanServerと指定した場合、アプリケーション・プロジェクトはAslanServer.hファイルを提供する必要があります。AslanServer.hファイルは、bootserverclass.hファイルの例です。bootserverclassファイルは、このサンプル・コードと同じようなロジックを提供します。リスト4-1 bootserverclass.hファイルの例// File name: AslanServer.h
#include <Server.h>
class AslanServer : public ServerBase {
public:
CORBA::Boolean initialize(int argc, char** argv);
void release();
Tobj_Servant create_servant(const char* interfaceName);
Tobj_Servant create_servant_with_id(const char* interfaceName,
const char* stroid);
CORBA::Boolean thread_initialize(int argc, char** argv);
void thread_release();
};buildobjclientコマンドを使用してクライアント・アプリケーションの実行可能プログラムを作成する場合、アプリケーションは適切なプラットフォーム固有のコンパイラ設定を使用してコンパイルされ、使用するオペレーティング・システム用の適切なスレッド・サポート・ライブラリを使用してリンクされます。これにより、Oracle Tuxedoソフトウェアが提供する共有ライブラリとクライアントの互換性が保証されます。Oracle Tuxedo CORBA環境でCORBAサーバー・アプリケーションを実行するには、buildobjserverコマンドでそのアプリケーションをビルドしておく必要があります。buildobjserver -tオプションを使用すると、Oracle TuxedoシステムにCORBAサーバー・アプリケーションがスレッド・セーフであることを通知できます。-tオプションは、アプリケーションが共有コンテキスト・データ、およびスレッド・セーフではない他のプログラミング構造を使用しないことを示します。スレッド・セーフではないシングル・スレッド・アプリケーションをマルチスレッド環境で実行すると、データが破損するおそれがあります。
•
注意: プロセスを終了するためのSIGKILLシグナルがサポートされています。シングル・スレッドまたはマルチスレッド・アプリケーションに対するSIGIOの使用は、Oracle Tuxedo CORBAではサポートされていません。
• CORBAサーバー・アプリケーション・コードを更新し、TobjServantBase::_is_reentrantメソッドを使用してリエントラントを有効化します。マルチスレッド・サーバーの目的は、1つ以上のクライアントからの複数のリクエストを並列に処理することです。simpapp_mtサンプル・アプリケーションは、buildobjserver -tコマンド行オプションを使用し、UBBCONFIGファイルを使用して同時実行性戦略を指定することによってマルチスレッド機能を例示するCORBAアプリケーションです。simpapp_mtサンプルは、最初にSimplePerObjectというサーバー・プロセスを作成し、次にSimplePerRequestというサーバー・プロセスを作成します。クライアントは、最初にSimplePerRequestサーバーと通信し、次にSimplePerObjectサーバーと通信します。SimplePerRequestのリクエストごとのスレッド・サーバー実装は、スレッド初期化メソッドを実装するユーザー定義のサーバー・クラスの使用方法を例示します。SimplePerRequestサーバー・プロセスは、クライアントからの各リクエストを独立した制御スレッドで処理します。新しいリクエストが到着するたびに、そのリクエストを処理するためにスレッド・プールからスレッドが割り当てられます。リクエストが処理され、応答が送信されると、そのスレッドはプールに戻されます。このモデルは、複数のクライアントからの長期のリクエストを処理するサーバーに適しています。
• 図4-2に、オブジェクトごとのスレッド・モデルとリクエストごとのスレッド・モデルの両方を使用するsimpapp_mtサンプル・アプリケーションの操作を示します。
リスト4-2に、simpapp_mtサンプル・アプリケーションのCORBAインタフェースを定義したsimple.idlファイルの内容を示します。#pragma prefix "beasys.com"この項では、simpapp_mtサンプル・アプリケーションをビルドおよび実行するプロセスをステップごとに説明します。図4-3に、このプロセスの要約を示します。以降の項では、これらのタスクを実行する方法について説明します。simpapp_mtサンプル・アプリケーションをビルドおよび実行する前に、TUXDIR環境変数がシステムで設定されていることを確認してください。通常、この環境変数はインストール・プロセス中に設定されます。この環境変数に適切なディレクトリが定義されていることを確認する必要があります。
1. プロンプトに対してkshコマンドを実行して、Kornシェルを起動します。prompt> set TUXDIR=directorypath
1. システム・プロンプトに対してkshコマンドを実行して、Kornシェルを起動します。ksh prompt> export TUXDIR=directorypath
注意: simpappマルチスレッド・サンプルを実行するときにどのようなファイルが新しく作成されるかを確認できるよう、作業ディレクトリを使用することをお薦めします。runmeコマンドの実行後に、インストール・ディレクトリ内のファイル・セットと作業ディレクトリ内のファイル・セットを比較してください。cd work_directory
2. すべてのsimpapp_mtファイルを作業ディレクトリにコピーします。cd work_directory表4-1に、アプリケーションをビルドおよび実行するためのsimpapp_mtファイルとその説明を示します。
表4-1 simpapp_mtファイル simpapp_mtサンプル・アプリケーションのビルドと実行に関する情報を提供するReadmeファイル。 サーバーに組み込まれるSimpleサーバントとSimplePerObjectFactoryサーバントの実装が含まれるソース・コード。CORBAサーバーは、オブジェクトごとのスレッド同時実行性戦略を使用して起動します。 simpapp_mtサンプル・アプリケーション、オブジェクトごとのスレッド同時実行性戦略用のCORBAサーバー・プログラム・ソース・コード。UBBCONFIGファイルにCONCURR_STRATEGY = PER_OBJECTを設定します。 リエントラント・サーバーに組み込まれるSimpleサーバントとSimplePerRequestFactoryサーバントの実装が含まれるソース・コード。リエントラントCORBAサーバーは、リクエストごとのスレッド同時実行性戦略を使用して起動します。 simpapp_mtサンプル・アプリケーション、リクエストごとのスレッド同時実行性戦略用のCORBAサーバー・プログラム・ソース・コード。UBBCONFIGファイルにCONCURR_STRATEGY = PER_REQUESTを設定します。 simpapp_mtサンプル・アプリケーションのユーザー定義Serverクラスに対して必要な宣言が含まれるbootserverclass.hファイルの例。 > chmod u+r work_directory/*.*この項では、アプリケーションのエンドツーエンドの実行に必要な手順について説明します。次のようにrunmeコマンドを入力します。> cd work_directory> cd work_directory
3.
7. このサンプル用のubb構成ファイルを作成します。
10.
11.
18. simpapp_mtサンプル・アプリケーションは、runmeコマンドの実行中に次のメッセージを出力します。
• log - コンパイル、サーバー起動またはサーバー停止のエラー
• output - クライアント・アプリケーションの出力と例外
• ULOG.date - サーバー・アプリケーションのエラーと例外
表4-2 作業ディレクトリに作成されるファイル resultsディレクトリ このスクリプトの実行結果を取得するためにrunmeコマンドによって作成されます。 admディレクトリ セキュリティ暗号化キー・データベース・ファイルを格納するためにrunmeコマンドによって作成されます。
simpapp_mtサンプル・アプリケーション用のUBBCONFIGファイル。 ULOG.date 実行時エラーを格納するためのULOGファイル。この項では、simpapp_mtサンプル・アプリケーションをステップ・バイ・ステップ・モードで実行する方法について説明します。simpapp_mtをステップ・バイ・ステップ・モードで実行するには、あらかじめrunmeコマンドを実行しておく必要があります。
1. >tmboot -y
Booting all admin and server processes in /work_directory/results/tuxconfig表4-4に、tmbootによって起動するサーバー・プロセスを示します。
TMFFNAMEサーバー・プロセス。
•
•
• クライアント・アプリケーションを実行すると、リスト4-3のようなメッセージが表示されます。
1. アプリケーションを終了するには、tmshutdown -yコマンドを実行します。次のような情報が表示されます。スレッド・プールの最小サイズと最大サイズを指定するためのMAXDISPATCHTHREADSパラメータとMINDISPATCHTHREADSパラメータは、UBBCONFIGファイルのSERVERSセクションに存在します。これらのパラメータの指定例については、リスト4-4を参照してください。マルチスレッドCORBAアプリケーションは、これらの値を使用してスレッド・プールを作成および管理します。MAXDISPATCHTHREADSパラメータは、各サーバー・プロセスで生成される、同時に実行できるディスパッチ・スレッドの最大数を決定します。このパラメータを指定する際には、次の事項を考慮してください。
•
注意: MAXDISPATCHTHREADSに1より大きい値を指定し、CONCURR_STRATEGYスレッド・モデル・パラメータの値を指定しなかった場合、アプリケーションのスレッド・モデルはデフォルトによってオブジェクトごとのスレッドに設定されます。CONCURR_STRATEGYスレッド・モデル・パラメータの詳細は、4-35ページの「スレッド・モデルの指定」を参照してください。
注意:
• オペレーティング・システムのリソースによって、1つのプロセスで作成できるスレッドの最大数が制限されます。MAXDISPATCHTHREADSは、その制限値から、アプリケーションが必要とするアプリケーション管理スレッドの数を差し引いた値未満にする必要があります。MAXDISPATCHTHREADSパラメータの値は、他のパラメータにも影響を与えます。たとえば、MAXACCESSORSパラメータはOracle Tuxedoシステムへの同時アクセス数を制御し、各スレッドは、1つのアクセサとしてカウントされます。マルチスレッド・サーバーのアプリケーションの場合、各サーバーの実行が構成されているシステム管理のスレッドの数を考慮しておく必要があります。システム管理のスレッドとは、アプリケーションで開始され管理されるスレッドとは対照的に、Oracle Tuxedoソフトウェアで開始され管理されるスレッドです。内部ではOracle Tuxedoが、利用可能なシステム管理のスレッドのプールを管理しています。クライアント・リクエストが受信されると、スレッド・プールから利用可能なシステム管理のスレッドがそのリクエストを実行するようにスケジューリングされます。リクエストが完了すると、システム管理のスレッドは利用可能なスレッドのプールに戻されます。サーバーが最初にブートされたときに開始されるサーバー・ディスパッチ・スレッドの数を指定するには、MINDISPATCHTHREADSパラメータを使用します。このパラメータを指定する際には、次の事項を考慮してください。CONCURR_STRATEGYパラメータを使用して、マルチスレッドCORBAサーバー・アプリケーションが使用するスレッド・モデルを指定します。CONCURR_STRATEGYパラメータは、次のいずれかの値を受け付けます。CONCURR_STRATEGY = PER_REQUESTを指定してリクエストごとのスレッド・モデルを採用した場合、CORBAサーバー・アプリケーションの各呼出しはスレッド・プール内の任意のスレッドに割り当てられます。CONCURR_STRATEGY = PER_OBJECTを指定してオブジェクトごとのスレッド・モデルを採用した場合、アクティブな各オブジェクトは常に1つのスレッドに関連付けられます。オブジェクトに対するリクエストごとに、ディスパッチ・スレッドとオブジェクトとの関連付けが確立されます。スレッド・モデルの特性の詳細は、4-5ページの「スレッド・モデル」を参照してください。掲示板のアクティブ・オブジェクト・マップ表に格納されるマシンごとのオブジェクトの最大数を指定するには、MAXOBJECTSパラメータを使用します。この値は、構成ファイルのRESOURCESセクションとMACHINESセクションのいずれかで設定できます。RESOURCESセクションのMAXOBJECTS numberは、システム全体にわたる設定です。システム全体にわたる設定をマシンごとにオーバーライドするには、MACHINESセクションのMAXOBJECTS numberを使用します。*RESOURCES
MAXOBJECTS number*MACHINES
MAXOBJECTS = number
注意: *RESOURCES
IPCKEY 55432
DOMAINID simpapp
MAXOBJECTS 100
MASTER SITE1
MODEL SHM
LDBAL N
*MACHINES
"sunstar"
LMID = SITE1
APPDIR = "/rusers1/lyon/samples/corba/simpapp_mt"
TUXCONFIG = "/rusers1/lyon/samples/corba/simpapp_mt/results/tuxconfig"
TUXDIR = "/usr/local/TUXDIR"
MAXWSCLIENTS = 10
MAXACCESSERS = 200*SERVERS
DEFAULT:
RESTART = Y
MAXGEN = 5
TMSYSEVT
SRVGRP = SYS_GRP
SRVID = 1
TMFFNAME
SRVGRP = SYS_GRP
SRVID = 2
CLOPT = "-A -- -N -M"
TMFFNAME
SRVGRP = SYS_GRP
SRVID = 3
CLOPT = "-A -- -N"
TMFFNAME
SRVGRP = SYS_GRP
SRVID = 4
CLOPT = "-A -- -F"
simple_per_object_server
SRVGRP = APP_GRP1
SRVID = 1
MINDISPATCHTHREADS = 10
MAXDISPATCHTHREADS = 100
CONCURR_STRATEGY = PER_OBJECT
RESTART = N
simple_per_request_server
SRVGRP = APP_GRP2
SRVID = 2
MINDISPATCHTHREADS = 10
MAXDISPATCHTHREADS = 100
CONCURR_STRATEGY = PER_REQUEST
RESTART = N
ISL
SRVGRP = SYS_GRP
SRVID = 5
CLOPT = "-A -- -n //sunbstar:2468 -d /dev/tcp"