![]() ![]() ![]() ![]() ![]() ![]() |
Oracle Tuxedo /Qの管理者は、次の3つのタスクを行います。
構成やキューの属性には、アプリケーションの要件が反映されていなければなりません。そのため、アプリケーション開発者とプログラマがよく協力することが大切です。
キュー機能の使い方を簡単に示すサンプルがソフトウェアに提供されています。詳細は、「サンプル・アプリケーション」を参照してください。
Oracle Tuxedo /Qコンポーネントには、3つのサーバーが提供されています。 1つは、TMS_QM
というOracle Tuxedo /Qリソース・マネージャ用のトランザクション・マネージャ・サーバー(TMS)です。 このサーバーは、キュー機能でグローバル・トランザクションを管理します。 このサーバーは、構成ファイルのGROUPS
セクションで定義されていることが必要です。
ほかの2つは、TMQUEUE(5)およびTMQFORWARD(5)で、ユーザーにサービスを提供します。 この2つのサーバーは、構成ファイルのSERVERS
セクションで定義されている必要があります。
TMQFORWARD
の機能がアプリケーションのニーズを完全には満たさない場合、アプリケーション独自のキュー・サーバーを作成することもできます。 たとえば、エラー・キューに移動したメッセージをキューから取り出す特別なサーバーが必要な場合があります。
アプリケーションでは、ピア・ツー・ピア通信を選択することもできます。 この通信では、転送サーバーを使用せずに、アプリケーションはほかのアプリケーションと、クライアントはほかのクライアントと通信します。
標準要件であるグループ名のタグおよびGRPNO
の値(詳細についてはUBBCONFIG(5)を参照)のほかに、アプリケーションが使用するキュー・スペースごとに1つのサーバー・グループを定義する必要があります。 TMSNAME
およびOPENINFO
パラメータを設定する必要があります。 次は、この2つのパラメータの例です。
TMSNAME=TMS_QM
OPENINFO="TUXEDO/QM:<device_name
:<queue_space_name
>"
TMS_QM
は、Oracle Tuxedo /Qのトランザクション・マネージャ・サーバーの名前です。OPENINFO
パラメータのTUXEDO/QM
は、$TUXDIR/udataobj/RM
にあるリソース・マネージャのリテラル名です。<device_name
>および<queue_space_name
>の値は、状況に応じて決定され、汎用デバイス・リストのパス名、およびキュー・スペースに対応付けられた名前をそれぞれ設定する必要があります。これらの値は、qmadmin(1)を使用して、Oracle Tuxedoの管理者が指定します。
注意: | これらの値は、時系列順に指定されている必要はありません。 構成ファイルは、キュー・スペースを定義する前でも定義した後でも作成できます。 構成が定義され、以前に作成されたキュー・スペースとキューが使用できることが重要です。 |
GROUPS
セクションのエントリごとに、キュー・スペースを1つだけ使用できます。 CLOSEINFO
パラメータは使用されません。
次は、TMQUEUE(5)のリファレンス・ページから引用した例です。
*GROUPS
TMQUEUEGRP1 GRPNO=1 TMSNAME=TMS_QM
OPENINFO="TUXEDO/QM:/dev/device1:myqueuespace"
TMQUEUEGRP2 GRPNO=2 TMSNAME=TMS_QM
OPENINFO="TUXEDO/QM:/dev/device2:myqueuespace"
TMQUEUE(5)リファレンス・ページでは、構成ファイルのSERVERS
セクションについて詳しく説明しています。ここでは、特に大切な内容について説明します。
TMQUEUE
でタイムアウトが認識されるのは、CLOPT
パラメータで2つのダッシュ(--)の後に-t timeout
オプションが指定されている場合です。このタイムアウト値は、サーバーでトランザクションが有効ではないことが検出された場合に、サーバー内で開始された操作に適用されます。つまり、クライアントがtpbegin(3c)を呼び出さずにtpenqueue(3c)またはtpdequeue(3c)を呼び出した場合、トランザクションは有効になっていません。または、クライアントがトランザクションを開始し、
TPNOTRAN
フラグを設定してクライアントのトランザクションでキューにリクエストを登録しない場合に、tpenqueue()
またはtpdequeue()
を呼び出したときも、トランザクションは有効になっていません。timeout
のデフォルト値は30秒です。tpdequeue
リクエストの応答でflags
にTPQWAIT
が設定されている場合、待ち時間が-t
timeout
に指定された時間(秒単位)を超えると、TPETIME
エラーが返されます。
注意: | ctl は、TPQCTL 型の構造体で、tpenqueue(3c)およびtpdequeue(3c)で使用されて、呼出し側プロセスとシステム間でパラメータの受け渡しが行われます。TPQWAIT は、tpdequeue のフラグ設定の1つで、プロセスが応答メッセージを待機することを示します。この構造体の詳細は、「TPQCTL構造体」および「TPQUEDEF-REC構造体」を参照してください。COBOLでこれに相当するものは、TPQUEDEF-REC レコードです。 |
キュー・スペース名、キュー名、およびサービス名は、混同しやすいので注意してください。まず、メッセージ・キュー・サーバーTMQUEUE
の指定では注意が必要です。このサーバーを構成ファイルで指定する場合は、CLOPT
パラメータの-s
フラグを使用して、サーバーのあるインスタンスからサービスを受け取るキュー・スペースの名前を指定できます。これは、関数TMQUEUE
で公開されたサービスと同じです。キュー・スペースを1つだけ使用するアプリケーションでは、CLOPT -s
オプションを指定する必要はありません。デフォルトの-s
TMQUEUE:TMQUEUE
が使用されます。アプリケーションに複数のキュー・スペースが必要な場合、キュー・サーバーのSERVERS
セクションの-s
オプションの引数として、キュー・スペースの名前を指定します。
この指定を行う別の方法としては、buildserver(1)を使用してメッセージ・キュー・サーバーを再度ビルドし、同じように-s
オプションを使用してキュー・スペースの名前を指定することができます。 この方法では、実行可能サーバーにサービス名が固定、つまり「ハード・コーディング」されます。
# The following two specifications are equivalent:
*SERVERS
TMQUEUE SRVGRP="TMQUEUEGRP1" SRVID=1000 RESTART=Y GRACE=0 \
CLOPT="-s myqueuespace:TMQUEUE"
and
buildserver -o TMQUEUE -s myqueuespace:TMQUEUE -r TUXEDO/QM \
-f ${TUXDIR}/lib/TMQUEUE.o
followed by
..
..
..
TMQUEUE SRVGRP="TMQUEUEGRP1" SRVID=1000 RESTART=Y GRACE=0 \
CLOPT="-A"
前の項で、メッセージ・キュー・サーバー内のサービス(キュー・スペース名)の指定について説明しました。この機能を使用すると、キューのデータ依存型ルーティングを行うことができます。データ依存型ルーティングでは、メッセージがキューに登録されて、メッセージ・バッファのフィールド値に応じて特定のグループ内のサービスによって処理されます。その場合、同じキュー・スペース名を2つの異なるグループに指定します。そして、ルーティングを構成ファイルで設定して、キューにあるメッセージの処理を行うグループを指定します。次は、TMQUEUE(5)のリファレンス・ページから引用した例です。キュー・スペース名は変えてあります。
*GROUPS
TMQUEUEGRP1 GRPNO=1 TMSNAME=TMS_QM
OPENINFO="TUXEDO/QM:/dev/device1:myqueuespace"
TMQUEUEGRP2 GRPNO=2 TMSNAME=TMS_QM
OPENINFO="TUXEDO/QM:/dev/device2:myqueuespace"
*SERVERS
TMQUEUE SRVGRP="TMQUEUEGRP1" SRVID=1000 RESTART=Y GRACE=0 \
CLOPT="-s ACCOUNTING:TMQUEUE"
TMQUEUE SRVGRP="TMQUEUEGRP2" SRVID=1000 RESTART=Y GRACE=0 \
CLOPT="-s ACCOUNTING:TMQUEUE"
*SERVICES
ACCOUNTING ROUTING="MYROUTING"
*ROUTING
MYROUTING FIELD=ACCOUNT BUFTYPE="FML" \
RANGES="MIN-60000:TMQUEUEGRP1,60001-MAX:TMQUEUEGRP2"
TMQUEUE
では、ATMIのすべての標準バッファ・タイプがサポートされています。 アプリケーションでほかのバッファ・タイプを追加する必要がある場合は、$TUXDIR/tuxedo/tuxlib/types/tmsypesw.c
をコピーし、独自のバッファ・タイプのエントリを追加し、最終行のNULLが残っていることを確認し、変更したファイルをbuildserver(1)コマンドへの入力として使用します。 buildserver
コマンドの使用例については、TMQUEUE(5)のリファレンス・ページを参照してください。
追加したサーバー名は、CLOPT
パラメータ(前述を参照)に指定せずに、buildserver
コマンドの-s
オプションを使用してTMQUEUE
に対応付けることができます。
バッファのサブタイプはtpalloc(3c)サブタイプ・パラメータを使用して割り当てることができ、tptypes(3c)関数を使用して後でそれを取得できます。 この機能により、ユーザー定義のATMIバッファ・タイプを新しく作成せずに、データに型を割り当てることができます。 これは、文字配列(CARRAY
)または文字列(STRING
)を含むバッファで特に有用です。
TMQFORWARD(5)は、Oracle Tuxedo /Qで提供される3番目のサーバーです。 このサーバーは、指定されたキューからメッセージを取り出し、tpcall(3c)を介してそのメッセージをOracle Tuxedoサーバーに渡し、対応する応答メッセージを処理します。 構成ファイルでサーバーを定義する方法については、TMQFORWARD(5)のリファレンス・ページを参照してください。ここでは、特に大切な内容について説明します。
TMQFORWARD
は1つのサーバーであり、アプリケーションで使用される各インスタンスは、構成ファイルのSERVERS
セクションで定義されていなければなりません。ただし、TMQFORWARDには、通常のサーバーとは異なる次のような特徴があります。例:
TMQFORWARD
のインスタンスは、キューに対応するサーバー・グループを使用して、そのキュー・スペースに結び付けられます。特に、そのグループのOPENINFO
文の第3フィールドを使用して、キュー・スペースと結び付けられます。 以下に、これ以外の主なパラメータ、特に2つのダッシュに続くCLOPT
パラメータについて説明します。
-q
queuename
,
queuename
. . は必須パラメータです。このパラメータは、サーバーのこのインスタンスが確認する1つ以上のキューを指定します。queuename
は、最大127文字までのNULLで終了する文字列で、TMQFORWARD
によって一度キューから取り出されたメッセージを処理するアプリケーション・サービス名と同じです。また、メッセージ・キュー・サーバーTMQUEUE
を呼び出す準備をするときに、プログラマがtpenqueue(3c)またはtpdequeue(3c)の2番目の引数として指定する名前でもあります。
TMQFORWARD
は、TMQFORWARDが開始して終了するトランザクション内で機能します。 -t
trantime
オプションは、トランザクションがタイムアウトになるまでの時間(秒単位)を指定します。 TMQFORWARD
がキュー上にメッセージがあることを確認すると、トランザクションが開始されます。応答が応答キューまたは異常終了キューのいずれかに登録されると、そのトランザクションがコミットされます。そのため、トランザクションには、メッセージを処理するサービスの呼出しと応答の受信が含まれています。 デフォルト値は60秒です。
TMQFORWARD
は一度呼び出されると、割り当てられているキューを定期的に確認します。 キューが空であった場合は、-i
idletime
秒間停止してから再度確認を行います。 値が指定されていない場合、デフォルト値の30秒が使用されます。この値を0に設定すると、キューが継続的に確認されます。これは、キューが空の場合が多いときは、CPUリソースを浪費することになります。
-e
オプションが指定されていると、キューが空の場合にサーバーが正常に停止し、ユーザー・ログ・メッセージが生成されます。この機能は、キューに指定するしきい値コマンドに対して使用します。-e
オプションとしきい値コマンドの詳細は、「キュー・スペースとキューの作成」を参照してください。
サービス・リクエストがTMQFORWARD
から呼び出された後で異常終了した場合、トランザクションはロールバックされ、後で再試行できるようにメッセージは(キューに指定された再試行の制限回数まで)キューに戻されます。-d
オプションを使用すると、次の処理も行われます。つまり、異常終了したサービスでNULL以外の応答が返された場合、異常終了キューがメッセージに対応付けられ、キューが存在するときは、応答(および、それに対応付けられたtpurcode
)が異常終了キューに登録されて元のリクエスト・メッセージは削除されます。また、-d
オプションを使用すると、キューに設定されてた再試行回数の制限値に達すると同時に元のリクエスト・メッセージが削除され、元のリクエスト・メッセージはエラー・キューに登録されます。
このオプションで重要なことは、ただむやみに再試行するのではなく、発信元のライアントが異常終了メッセージを調べ、再試行が必要であるかどうかを判断するようにコーディングできることです。これにより、本質的な問題、たとえば、アカウントが存在していないために、レコードが「見つからない」場合などが原因で失敗した場合に、それを処理する方法が提供されます。
カスタマイズしたアプリケーション・バッファ・タイプをタイプ・スイッチに追加し、buildserver(1)コマンドを使用してTMQFORWARD
に組み込むことができます。 ただし、TMQFORWARD
をカスタマイズした場合は、-s
オプションでサービス名を指定することはできません。
構成パラメータについて、UBBCONFIG
パラメータの観点から説明してきました。 ただし、GROUPS
セクションおよびSERVERS
セクション内の指定は、tmconfig(1)
を使用して、実行中のアプリケーションのTUXCONFIG
ファイルに追加することもできます。「tmconfig、wtmconfig(1)」を参照してください。 グループおよびサーバーは、一度定義したら再起動する必要があります。
ここでは、qmadmin(1)の3つのコマンドについて説明します。これらのコマンドは、Oracle Tuxedo /Qコンポーネントのリソースを設定するために使用します。APPQ_MIB
管理情報ベース(MIB)を使用すると、Oracle Tuxedo /Qをプログラムで管理できるようになります。MIBの詳細は、APPQ_MIB(5)のリファレンス・ページを参照してください。
qmadmin
のほとんどの主なコマンドでは、位置パラメータが使用されています。 コマンドの呼出し時に、コマンドラインに位置パラメータ(オプションの前にダッシュ(-
)が付かないパラメータ)が指定されていない場合、必要な情報を入力するようにqmadmin
で要求されます。
汎用デバイス・リスト(UDL)は、Oracle Tuxedoで制御されるVTOCファイルです。 このファイルは、Oracle Tuxedoを実行するマシンに物理的な記憶空間をマッピングします。 UDLのエントリは、キューとキュー・スペースのメッセージが格納されるディスク領域を指定します。Oracle Tuxedoはその領域への入出力を管理します。 Oracle Tuxedoの新規インストールの一部としてキュー機能がインストールされる場合、構成ファイルの初回のロード時に、tmloadcf(1)によってUDLが生成されます。
キュー・スペースを作成する前に、UDLにそのキュー・スペースのエントリを作成する必要があります。 次は、コマンドの例です。
# First invoke the /Q administrative interface, qmadmin
# The QMCONFIG variable points to an existing device where the UDL
# either resides or will reside.
QMCONFIG=/dev/rawfs qmadmin
# Next create the device list entry
crdl /dev/rawfs 50 500
# The above command sets aside 500 physical pages beginning at block # 50
# If the UDL has no previous entries, offset (block number) 0 must # be used
既存のOracle Tuxedo UDLにエントリを追加する場合は、QMCONFIG
変数の値にはTUXCONFIG
で指定されたパス名と同じ値を指定する必要があります。 qmadmin
を一度呼び出したら、新しいエントリを作成する前に、lidl
コマンドを実行してどの領域を使用できるのかを確認します。
キュー・スペースでは、IPCリソースが使用されます。そのため、キュー・スペースを定義する場合は、共用メモリー・セグメントとセマフォを割り当てることになります。 前述のように、このコマンドを使用する簡単な方法はプロンプトを表示することです。 また、APPQ_MIB(5)のT_APPQSPACE
クラスを使用して、キュー・スペースを作成することもできます。 プロンプトは以下の順で表示されます。
> qspacecreate
Queue space name: myqueuespace
IPC Key for queue space: 230458
Size of queue space in disk pages: 200
Number of queues in queue space: 3
Number of concurrent transactions in queue space: 3
Number of concurrent processes in queue space: 3
Number of messages in queue space: 12
Error queue name: errq
Initialize extents (y, n [default=n]):
Blocking factor [default=16]: 16
このプログラムでは、最後の3行を除くすべてのプロンプトに値を入力する必要があります。 この例からわかるように、最後の2つのプロンプトではデフォルト値が使用されています。error queue nameの名前はほとんどの場合に必要ですが、必須ではありません。 ここで名前を指定した場合は、qcreate
コマンドを使用してエラー・キューを作成する必要があります。 error queue nameの名前が指定されていないと、通常は(たとえば、再試行回数の上限値に達した場合などに)エラー・キューに送られるメッセージは、永続的に失われることに注意してください。
共用メモリーの予約領域は、キュー・スペース内のすべてのキューの永続的ではないメッセージを格納するために使用されます。プログラムでは、この予約領域のサイズを指定するように要求されません。 永続的ではない(メモリー・ベースの)メッセージが必要な場合は、qspacecreateコマンドラインに-n
オプションを入力して、メモリー領域のサイズを指定する必要があります。
IPCキーには、ほかのIPCリソースの要件と競合しない値を指定します。 この値は32,768より大きく262,143未満にします。
キュー・スペースのサイズ、キューの数、および一度に登録できるメッセージの数は、アプリケーションのニーズによって決定されます。 UDLエントリで指定されたページ数より大きいサイズを指定することはできません。 また、これらのパラメータに関連して、キュー・スペース内の個々のqueue capacityパラメータを検討する必要があります。 これらのパラメータを使用すると、(a)キューに登録できるメッセージの上限値を設定し、(b)キューに登録されたメッセージの数がしきい値に達したときに実行するコマンドの名前を指定できます。 キュー・スペースに同時に登録できるメッセージの数を小さくすると、キューのしきい値に達しなくなります。
並列トランザクションの数を計算するには、以下の各項目を1つのトランザクションとしてカウントします。
クライアント・プログラムがtpenqueue
を呼び出す前にトランザクションを開始する場合、キュー・スペースに同時にアクセスするクライアント数だけカウント数を増やします。 最悪のケースは、すべてのクライアントがキュー・スペースに同時にアクセスすることです。
同時実行プロセスの数としては、このキュー・スペースを使用するグループのTMQUEUE
サーバー、TMQFORWARD
サーバー、またはTMS_QM
サーバーごとに1、余裕として1をカウントします。
qspacecreate
コマンドの使用時に、キュー・スペースを初期化するように設定できます。また、キュー・スペースを初めて開くときに、qopen
コマンドで初期化するように設定することもできます。
使用するキューは、qmadmin
のqcreate
コマンドで作成する必要があります。 まず、qopen
コマンドでキュー・スペースをオープンします。 キュー・スペース名が指定されていない場合は、qopen
で名前を入力するように求められます。 APPQ_MIB(5)のT_APPQ
クラスを使用して、キューを作成することもできます。
> qcreate
Queue name: service1
Queue order (priority, time, fifo, lifo): fifo
Out-of-ordering enqueuing (top, msgid, [default=none]): none
Retries [default=0]: 2
Retry delay in seconds [default=0]: 30
High limit for queue capacity warning (b for bytes used, B for blocks used,
% for percent used, m for messages [default=100%]): 80%
Reset (low) limit for queue capacity warning [default=0%]: 0%
Queue capacity command:
No default queue capacity command
Queue 'service1' created
これらすべてのプロンプト(queue nameのプロンプト以外)では、入力を省略できます。queue nameが指定されていない場合、プログラムで警告メッセージが表示され、再度プロンプトが表示されます。 これ以外のパラメータについてはプログラムでデフォルト値が用意されており、デフォルト値の使用を通知するメッセージが表示されます。
デフォルトの配信オプションやメモリーのしきい値のオプションを入力するようには求められません。 デフォルトの配信オプションを使用すると、配信モードが指定されていないメッセージを永続(ディスク・ベースの)ストレージに配信するか、または非永続(メモリー・ベースの)ストレージに配信するかを指定できます。 メモリーのしきい値オプションでは、非永続メモリーのしきい値に達したときに、コマンドを実行するための値を指定できます。 これらのオプションを使用するには、qcreateコマンドラインで-d
と-n
をそれぞれ指定する必要があります。
メッセージは、このパラメータで指定された順序でキューに登録され、キューからの取出しに順序付け条件が設定されている場合を除き、キューの先頭から取り出されます。 priority
、expiration、time
がキューの順序付け条件として選択されている場合、メッセージはTPQCTL
構造体の値に従ってキューに挿入されます。 順序付け条件を組み合せて指定する場合は、最も重要な条件を最初に指定します。 複数指定する場合は、カンマ(,
)で区切ります。 fifo
またはlifo
(この2つは、相互に排他的)が指定されている場合は、この値を最後に指定します。 パラメータが指定された順序によって、キューの順序付け条件が決定されます。 たとえば、priority, fifo
と指定されている場合、キューはメッセージの優先順位に従って取り出され、同じ優先順位のメッセージの場合は先入れ先出しで取り出されます。
管理者が順序を無視したキュー登録を有効にした場合、つまりプロンプトでtop
またはmsgid
が選択されている場合、プログラマはキューの先頭、またはmsgid
で識別されるメッセージの前にメッセージが入るように指定できます。その場合、tpenqueue
呼出しのTPQCTL
構造体の値を使用してください。 このオプションは、よく検討してから使用します。一度このオプションを設定すると、それを変更するにはキューを破棄して、再度作成する必要があります。
待機メッセージ機能の通常の動作では、メッセージをキューから取り出すトランザクションがロールバックされると、メッセージがキューに戻されます。 そのメッセージがキューの先頭に到達すると、再度キューから取り出されます。 必要な再試行の回数、および次の再試行までの遅延時間を指定できます。 キューから取り出されたメッセージが再試行のためにキューに戻されると、キューの順序付けは遅延時間(秒単位)だけ中断されます。 この間、メッセージをキューから取り出すことはできません。
再試行回数のデフォルト値は0です。これは、再試行が一度も行われないことを示します。 再試行回数の上限値に達すると、メッセージがキュー・スペースのエラー・キューに移されます。その場合、エラー・キューが指定され、作成されていることが前提です。 エラー・キューが存在しない場合は、メッセージは破棄されます。
遅延時間には、秒単位が使用されます。メッセージ・キューがすぐにいっぱいになり、キューに戻されたメッセージがすぐに先頭に達する場合、遅延要因を作成してCPUサイクルを節約することができます。再試行に関しては、使用するアプリケーションでのこれまでの経験に基づいて決定します。特定のキューに対応付けられたサービスに大量の競合がある場合、一時的な問題が多数発生します。このような問題に対処するには、再試行回数に大きな値を指定します。この値は、主観的なものです。次の再試行を行うまでの時間も同じです。ロールバックされたトランザクションで通知される障害が解消されないものである場合、再試行回数を0にしてメッセージを直ちにエラー・キューに移動します。これは、TMQFORWARD
で -d
オプションを指定する場合の動作とよく似ています。ただし、長さが0以外の異常終了メッセージは、キューから削除するためにTMQFORWARD
で自動的に受信される点が異なります。
qcreate
コマンドには、キューの管理を部分的に自動化する3つのパラメータがあります。これらのパラメータは、上下限のしきい値を設定します。しきい値は、バイト数、ブロック数、メッセージ数、またはキューの容量に対する割合(パーセント)で表すことができます。これにより、しきい値の上限に達したときに実行されるコマンドを指定できます。実際には、コマンドはしきい値の上限に達したときに一度だけ実行され、しきい値の上限より先に下限に達しないかぎり、再度実行されることはありません。
High limit for queue capacity warning (b for bytes used, B for blocks used, % for percent used, m for messages [default=100%]): 80%
Reset (low) limit for queue capacity warning [default=0%]: 10%
Queue capacity command: /usr/app/bin/mailme myqueuespace service1
この例は、しきい値の上限としてディスク・ベースのキュー容量の80%を設定し、キューの80%が使用されたときにコマンドが実行されるように指定しています。 このコマンドは、しきい値に達したときにメール・メッセージを送信するように作成されたスクリプトです。 myqueuespace
およびservice1
は、このコマンドに対する仮定的な引数です。 キューがいっぱいになったことが一度通知されると、その状況に対応するための操作を行うことができます。 警告メッセージを再度受け取るのは、キューのロードが容量の10%以下になり、もう一度80%に上がった場合だけです。 永続的ではない(メモリー・ベースの)キューの容量を管理するために、qcreateコマンドの-n
オプションを使用して、しきい値を設定したり、コマンドが実行されるように設定することもできます。
注意: | Windowsマシンを使用している場合、qmadmin() セッションでコマンドを設定する方法の詳細は、「Windows標準入出力」を参照してください。 |
2番目の例は、もう少し自動化されていて、TMQFORWARD
サーバーの -e
オプションを利用しています。
High limit for queue capacity warning (b for bytes used, B for blocks used, % for percent used, m for messages [default=100%]): 90%
Reset (low) limit for queue capacity warning [default=0%]: 0%
Queue capacity command: tmboot -i 1002
この例では、キューの予備のTMQFORWARD
サーバーとしてSRVID=1002
が設定されていること、そのCLOPT
パラメータに -e
オプションが指定されていることが前提となっています。また、サーバーが起動していないこと、または起動している場合は、キューが空であることが検出されたためにサーバーが自身をシャットダウンしたことも前提となっています。キューが容量の90%に達したとき、tmboot
コマンドが実行されて予備のサーバーが起動します。-e
オプションを使用すると、キューが空の場合にサーバーが自身を停止します。この例では、すでに起動しているサーバーに対して不要なtmboot
コマンドを起動しないために、しきい値の下限として0%が設定されています。
この3つのオプションのデフォルト値は、100%、0%、およびコマンドなしです。
キューの作成方法、およびキューの操作を行うためのパラメータの指定方法について説明してきました。これまで、メッセージが登録されるキューを作成する場合に、同じ名前のサービスでキューが処理されることが前提となっていました。キューは、ピア・ツー・ピア通信などほかの目的で使用される場合もあります。キュー作成時のパラメータは、キューの用途が異なっても同じものが使用されます。メッセージがサービス・キューに登録される際に使用されるTPQCTL
構造体には、応答キューおよび異常終了キューの名前を指定するためのフィールドがあります。TMQFORWARD
は、リクエストされたサービスに対してTMQFORWARDが呼び出したtpacall(3c)が正常終了したか異常終了したかを検出します。そして、これらのキューが管理者によって作成されてものである場合は、その応答を設定に応じてキューに登録します。応答キューまたは異常終了キューが存在しない場合は、サービスからの正常終了または異常終了の応答メッセージは削除されます。その場合、リクエストの発信元であるクライアントには、キューに入れられたリクエストの結果に関しては、何も通知されません。サービスから応答メッセージがない場合でも、応答キューが存在するときは、TMQFORWARD
によって長さ0のメッセージがそのキューに登録されて、リクエストの発信元であるクライアントに結果が通知されます。
応答キューまたは異常終了キューを作成する場合は、これらのキューからのメッセージの取出しは、事前に登録したリクエストに関する情報を求めているクライアント・プロセスによって行われることに注意してください。このようなメッセージをキューから取り出す一般的な方法は、そのメッセージに対応付けられているmsgid
(メッセージ識別子)またはcorrid
(相関識別子)を使用することです。これは、キューの先頭からメッセージを取り出す方法と対照的です。そのため、キューの順序付け条件は、あまり意味を持ちません。その場合、fifo
を設定しておけば十分です。retries
パラメータおよびretry delay
パラメータは、応答キューの場合は意味がないので、デフォルト値を使用してください。queue capacity
のしきい値とコマンドは、応答キューでも利用できます。これらを使用して管理者に警告を通知し、管理者が対応できるようにすると便利です。
エラー・キューは、システムのキューです。 qspacecreate
プロンプトの1つで、キュー・スペースのエラー・キューの名前を入力するように求められます。 指定された名前のエラー・キューが実際に作成されている場合、そのエラー・キューに再試行回数の上限に達したサービス・キューのメッセージが移されます。 エラー・キューのメッセージは、qmadmin
のコマンドを使用して手動で処理することも、APPQ_MIB
MIBを使用して自動化された方法で処理することもできます。このようなエラー・キューの管理方法は、管理者が決定します。 エラー・キューには、queue capacity
パラメータを使用することができます。ただし、qname
を除くほかのすべてのqcreate
のパラメータは使用できません。
注意: | エラー・キューとサービス異常終了キューには、同じキューを使用しないことをお薦めします。同じキューを使用すると、アプリケーションの管理が難しくなり、クライアントが管理者の領域にまでアクセスすることも起こり得ます。 |
通常、TMQUEUE
およびTMQFORWARD
で暗号化メッセージ・バッファが処理される場合、復号化は行われません。ただし、『Oracle Tuxedoのセキュリティ機能』の/Qとの互換性および相互運用性に関する項で説明したように、/Qコンポーネントでメッセージが登録されたバッファを復号化することが必要な場合があります。
/Qとの互換性および相互運用性に関する項で説明したように、トランザクションに関与しないtpdequeue()
操作では、起動中のプロセスが有効な復号化キーを持っていない場合、キューの暗号化されたメッセージが破壊されます。そのため、アプリケーションのプログラマは、暗号化されたメッセージを取り出すためにプロセスでtpdequeue()
を呼び出す場合は、事前にそのプロセスの復号化キーをオープンしておく必要があり、オープンしていない場合、メッセージは失われます。
復号化キーをオープンする方法については、『Oracle Tuxedoのセキュリティ機能』のプラグインによる復号化キーの初期化に関する項および暗号化されたメッセージを受信するためのコードの記述に関する項を参照してください。
ここでは、効率的にキュー・スペースを操作できるように、キューの管理者が行うべき作業について説明します。
キュー・スペースのディスク・ストレージを増やす必要がある場合は、qmadmin(1)のqaddext
コマンドを使用します。APPQ_MIB(5)のT_APPQSPACE
クラスのTA_MAXPAGES
属性を使用して、エクステントを追加することもできます。qmadmin
コマンドは、キュー・スペース名およびページ数を引数として取ります。ページは、QMCONFIG
変数に指定されたデバイスに対して、UDLで定義されているエクステントから割り当てられます。キュー・スペースは、アクティブでないことが条件です。感嘆符を使用すると、qmadmin
外のコマンドを実行できるので、対応付けられたサーバー・グループを停止できます。例:
> !tmshutdown -g TMQUEUEGRP1
> qclose
> qaddext myqueue 100
キュー・スペースは、クローズしていなければなりません。オープンしているキュー・スペースにエクステントの追加を試みると、qmadmin
によってそのキューがクローズします。 現在キュー・スペースにある永続的ではないメッセージは、qaddext
コマンドが発行されて正常終了すると、すべて失われます。
キュー・スペースのバックアップを作成する場合は、UNIXコマンドのdd
を使用すると便利です。 まず、対応付けられたサーバー・グループをシャットダウンします。 次のようにコマンドを入力します。
tmshutdown -g TMQUEUEGRP1
dd if=<qspace_device_file> of=<output_device_filename>
そのほかのオプションについては、UNIXシステムのdd
(1)リファレンス・ページを参照してください。
キュー・スペースをアーキテクチャが同じである別のマシンに移動する場合も、同じコマンドを使用できます。ただし、現在のデバイス名が移動先のマシンに存在しない場合は、qmadmin
のchdl
コマンドで開始して、新しいデバイス名を指定する必要があります。
dd
コマンドを持たないサーバー・プラットフォームでも、同じようなアーカイブ方法を使用できます。 まず、バックアップを作成するキュー・スペース、または移動するキュー・スペースを含むグループをシャットダウンします。 次に、アーカイブ・ツールを使用して、バックアップとして使用できるファイルなどの媒体、またはキュー・スペースを別のサーバーに移動する際に使用されるファイルなどの媒体に、キュー・スペースのデバイスを保存します。
異なるアーキテクチャ(主にバイトの並び順)を持つマシンにキュー・スペースを移動する場合、その手順は複雑になります。 まず、キュー・スペースにあるすべてのキューからすべてのメッセージを取り出すアプリケーション・プログラムを作成して実行します。次に、それらのメッセージをマシンに依存しない形式で書き出します。 最後に、メッセージを新しいキュー・スペースに登録します。
TMQFORWARD
を使用してキューから取り出されて転送されるメッセージは、グループの境界を越えて処理されるので、グローバル・トランザクション内で実行されます。 リソース・マネージに対応付けられていないサーバー、またはグローバル・トランザクション内で実行していないサーバーによってメッセージが実行される場合は、TMSNAME=TMS
(NULL XAインタフェースの場合)であるサーバー・グループが必要です。
メッセージが実行のためにキューから取り出された際にTMQFORWARD
で開始されたグローバル・トランザクションは、tpcommit
()によって終了します。 管理者は、構成ファイルにCMTRET
パラメータを設定して、トランザクションのログへの記録時または完了時にトランザクションのコミットを設定できます。 UBBCONFIG(5)のRESOURCES
セクションのCMTRET
の説明を参照してください。
トランザクション・タイムアウトを処理するには、キューの管理者と、メッセージをキューから取り出すクライアント・プログラムを開発するプログラマが協力することが必要です。 tpdequeue(3c)が呼び出され、そのflags
引数にTPQWAIT
が設定されている場合、TMQUEUE
サーバーはメッセージがキューに到着するまで待機します。 タイムアウトになるまでの時間(秒単位)は、次の条件によって決定されます。
TPQWAIT
が設定されている場合にメッセージがすぐに利用できないときは、TMQUEUE
にはほかのサービス・リクエストを処理するためのアクション・リソースが必要になります。 キュー・スペースが同時に処理できるアクション数を増やすこともできます。その場合、
qspacecreate
またはqspacechange
コマンドに、-A
actions
オプションを使用します。このオプションは、同時に処理できる追加のアクション数を指定します。処理の待機中にほかのアクションを実行できる場合、条件が満たされるまでブロッキング操作は中断されます。実行できるアクションがない場合は、tpdequeue
の呼出しは失敗します。
TMQFORWARD
サーバーがサービスにメッセージを転送したときにそのサービスが利用できなかった場合、キューに対する再試行回数の上限に達することがあります。 メッセージは、エラー・キューが存在する場合はそこに移されます。 このような状態を避けるには、管理者がTMQFORWARD
サーバーを停止するか、または再試行回数の上限値を増やします。
メッセージはエラー・キューに移動されると、元のキューとは関連がなくなります。 サービスが利用可能になったときに、管理者がメッセージをサービス・キューに戻してエラーを修復すると、キュー名がTPQCTL
構造体のcorrid
に格納されて、キュー名がメッセージと対応付けられます。
「キューの容量の上限」で説明したqchange ...Queue capacity command
など、qmadmin()
セッション内で構成したコマンドを実行するために、WindowsのCreateProcess()
関数ではDETACHED PROCESS
として子プロセスが生成されます。 このようなプロセスには、標準入出力のための関連コンソールがありません。 そのため、たとえば、標準DOS構文でqchange ... Queue capacity command
を設定して、組込みのDOSコマンド(dir
またはdate
など)を実行し、次に標準出力をファイルにパイプまたはリダイレクトすると、コマンドが正常終了してもファイルは空です。
この問題を解決する方法として、たとえば、qchange ... Queue capacity command
を実行するために、date /t > x.out
コマンドでファイルのdate
情報を取得します。 この処理を対話的に行うには、次のような手順で実行します。
qmadmin
> qopenyourQspace
> qchangeyourQname
>go through all the setups... the threshold queue capacity warning,
and so on> "Queue capacity command: " cmd /c date /t > x.out
この処理をyourFile
.cmd
などのコマンド・ファイルから行う場合は、date /t > x.out
コマンドをyourFile
.cmd
に追加し、次のように実行します。
qmadmin
> qopenyourQspace
> qchangeyourQname
>go through all the setups... the threshold queue capacity warning,
> "Queue capacity command: "
and so onyourFile
.cmd
![]() ![]() ![]() |