BEA Logo BEA Tuxedo Release 8.0

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

 

   Tuxedoホーム   |   BEA Tuxedo C リファレンス   |   先頭へ   |   前へ   |   次へ   |   目次

 


tpdequeue(3c)

名前

tpdequeue() -キューからメッセージを取り出すルーチン

形式

#include <atmi.h> 
int tpdequeue(char *qspace, char *qname, TPQCTL *ctl, char **data,
long *len, long flags)

機能説明

tpdequeue() は、キュー・スペース qspace 内の qname で指定されるキューから、処理するメッセージを取り出します。

省略時設定では、キューの先頭のメッセージが取り出されます。キュー上のメッセージのデフォルトの順序は、そのキューの作成時に定義されます。アプリケーションは、ctl パラメータでメッセージ識別子または相関識別子を指定することにより、特定のメッセージのキューからの取り出しを要求できます。メッセージが現在利用できなかった場合にはアプリケーションはメッセージを待つということを示すために、ctl フラグを使用することもできます。ctl パラメータを使って、メッセージをキューから削除したりキューでのメッセージの相対位置を変更せずにメッセージを見ることができます。この後のこのパラメータについての説明を参照してください。

data は、メッセージの読み込み先であるバッファを指すポインタのアドレスです。len は、そのメッセージの長さを指します。*data は、事前に tpalloc() によって割り当てられたバッファを指さなければなりません。メッセージが tpdequeue に渡されるバッファよりも大きい場合、バッファはメッセージが入れる大きさまで拡大されます。メッセージ・バッファのサイズに変化があるかどうかを判別するには、tpdequeue() が発行される前の (合計の) サイズを *len と比較します。*len のほうが大きい場合、バッファは大きくなっています。そうでない場合は、バッファのサイズは変更されていません。なお、*data は、バッファのサイズが大きくなったこと以外の理由でも変化する可能性があるので注意してください。終了時に *len が 0 である場合は、取り出されたメッセージにはデータ部がなく、*data も *data が指すバッファも変更されていません。*data または len が NULL であるとエラーになります。

呼び出し元がトランザクション・モードにあり、TPNOTRAN フラグが設定されていない場合は、メッセージはトランザクション・モードでキューから取り出されます。この結果、tpdequeue() が正常終了して呼び出し元のトランザクションが正常にコミットされると、要求はキューから削除されます。呼び出し元のトランザクションが、明示的に、あるいはトランザクション・タイムアウトまたは何らかの通信エラーの結果としてロールバックされると、メッセージはキュー上に残されます (つまり、キューからのメッセージの削除もロールバックされます)。同じトランザクション内で、同じメッセージの登録と取り出しを行うことはできません。

呼び出し元がトランザクション・モードにないか、または TPNOTRAN フラグが設定されている場合は、メッセージはトランザクション・モードではキューから取り出されません。トランザクション・モードでないときに通信エラーまたはタイムアウトが発生した場合、アプリケーションにはメッセージが正しくキューから取り出されたかどうかがわからず、メッセージが失われることがあります。

次に、有効な flags の一覧を示します。

TPNOTRAN

呼び出し元がトランザクション・モードにあり、このフラグが設定されていると、メッセージは、呼び出し元と同じトランザクション内ではキューから取り出されません。このフラグを設定する、トランザクション・モードの呼び出し元は、メッセージをキューから取り出すときに、やはりトランザクション・タイムアウトの影響を受けます (それ以外はなし)。キューからのメッセージの取り出しに失敗した場合、呼び出し元のトランザクションは影響されません。

TPNOBLOCK

ブロッキング条件が存在すると、メッセージはキューから取り出されません。このフラグが設定されていて、メッセージの転送先である内部バッファがいっぱいであるなどのブロッキング条件が存在する場合、呼び出しは異常終了し、tperrno()TPEBLOCK が設定されます。このフラグが設定されていて、ターゲットのキューが別のアプリケーションによって排他的にオープンされているなどのブロッキング条件が存在する場合、呼び出しは異常終了して tperrno()TPEDIAGNOSTIC が設定され、TPQCTL 構造体の診断フィールドは QMESHARE に設定されます。後者の場合、BEA Tuxedo ATMI システム以外の BEA 製品をベースとする別のアプリケーションが、キューイング・サービス API (QSAPI) を使って排他的な読み書きのためのキューをオープンします。

TPNOBLOCK が指定されていないときにブロッキング条件が存在すると、呼び出し元は、その条件が解消されるか、またはタイムアウト (トランザクションまたはブロッキング) が発生するまではブロックされます。(TPQCTL 構造体の) flagsTPQWAIT オプションが指定されている場合は、このブロッキング条件には、キュー自体のブロッキングは含まれません。

TPNOTIME

このフラグは、呼び出し元が無制限にブロックでき、ブロッキング・タイムアウトの対象にならないようにすることを指定します。トランザクション・タイムアウトは依然として発生する可能性があります。

TPNOCHANGE

このフラグが設定されていると、*data が指すバッファのタイプは変更されません。デフォルトでは、*data が指すバッファ型と異なるバッファ型を受信すると、*data のバッファ型は受信したバッファ型に変更されます (受信プロセスがそのバッファ型を認識できる場合)。つまり、受信されたバッファのタイプおよびサブタイプは、*data が指すバッファのタイプおよびサブタイプと一致しなければなりません。

TPSIGRSTRT

このフラグが設定されていると、シグナルによって中断された基本となるシステム・コールが再発行されます。このフラグが設定されていないときにシグナルによってシステム・コールが中断されると、呼び出しは異常終了し、tperrno()TPGOTSIG に設定されます。

tpdequeue() が正常終了すると、アプリケーションは、ctl データ構造体を使用してメッセージに関する追加情報を取得できます。この情報には、キューから取り出されたメッセージのメッセージ識別子、すべての応答または異常終了メッセージに付随して、発信元がメッセージと元の要求を結び付けることができるようにする相関識別子、メッセージが送られるサービスの品質、メッセージの応答が送られるサービスの品質、応答が要求された場合は応答キューの名前、およびメッセージをキューから取り出すときの失敗に関する情報をアプリケーションが登録できる異常終了キューの名前が含まれます。これらについては、次に説明します。

マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpdequeue() の呼び出しを発行できません。

制御パラメータ

TPQCTL 構造体は、アプリケーション・プログラムが、キューからのメッセージの取り出しに関連するパラメータを渡したり、取得したりするために使用します。TPQCTL の要素 flags は、この構造体の他のどの要素が有効であるかを示すために使用されます。

tpdequeue()への入力時には、次の要素を TPQCTL 構造体に設定できます。

long flags;            /* どの値が
* 設定されるかの指定 */
char msgid[32]; /* キューから取り出すメッセージの ID */
char corrid[32]; /* キューから取り出す
* メッセージの相関識別子 */

tpdequeue() の入力情報を制御する flags パラメータの有効なビットの一覧を次に示します。

TPNOFLAGS

フラグは設定されません。制御構造体から情報は得られません。

TPQGETBYMSGID

このフラグを設定すると、ctl->msgid によって指定されたメッセージ識別子を持つメッセージのキューからの取り出しを要求します。メッセージ識別子は、事前の tpenqueue(3c) の呼び出しによって取得できます。メッセージが別のキューに移動すると、メッセージ識別子が変わることに注意してください。また、メッセージ識別子の値は 32 バイトすべてが意味を持つため、ctl->msgid によって指定された値を完全に初期化する必要があります (たとえば、ヌル文字で埋めるなど)。

TPQGETBYCORRID

このフラグを設定すると、ctl->corrid によって指定された相関識別子を持つメッセージのキューからの取り出しを要求します。相関識別子は、アプリケーションが tpenqueue() でキューにメッセージを登録したときに指定されます。また、相関識別子の値は 32 バイト全体が意味を持つため、ctl->corrid によって指定された値を完全に初期化する必要があります (たとえば、ヌル文字で埋めるなど)。

TPQWAIT

このフラグを設定すると、キューが空の場合にはエラーは返されません。代わりに、メッセージを取り出せるようになるまで、プロセスは待機します。TPQGETBYMSGID または TPQGETBYCORRID とともに TPQWAIT が設定されている場合、指定されたメッセージ識別子または相関識別子を持つメッセージがキュー内に存在しない場合はエラーが返されません。代わりに、基準を満たすメッセージが利用可能になるまで、プロセスは待機しています。プロセスが呼び出し元のトランザクション・タイムアウトに従っている場合、またはトランザクション・モードでない場合、TMQUEUE プロセスに -t オプションで指定されたタイムアウトの影響を受けます。

要求する基準を満たすメッセージがすぐには利用できず、設定されたアクションのリソースを使い尽くしてしまった場合には、tpdequeue は -1 を返し tperrno()TPEDIAGNOSTIC に設定し、TPQCTL 構造体の診断フィールドを QMESYSTEM に設定します。

TPQWAIT 制御パラメータを指定する tpdequeue() の各要求では、条件を満たすメッセージがすぐに利用できない場合、キュー・マネージャ (TMQUEUE) のアクション・オブジェクトを使用できる必要があります。アクション・オブジェクトが使用できない場合、tpdequeue() 要求は失敗します。使用可能なキュー・マネージャのアクションの数は、キュー・スペースが作成または修正されるときに指定されます。待機中のキューからの取り出し要求が終了すると、対応する関連アクション・オブジェクトが別の要求でも利用できるようになります。

TPQPEEK

このフラグが設定されていると、指定されたメッセージは読み取られますが、キューからは削除されません。このフラグは、tpdequeue() 操作に TPNOTRAN フラグが設定されていることを意味します。つまり、非破壊的なキューからの取り出しはトランザクションに含まれません。トランザクション終了前のトランザクション内で、キューに登録されたメッセージまたはキューから取り出されたメッセージを読み取ることはできません。

スレッドが TPQPEEK を使用してメッセージを非破壊的にキューから取り出している場合、システムが非破壊的なキューからの取り出し要求を処理している短い間、他のブロッキングされていない取り出し要求元からは、このメッセージが見えない場合があります。この中には、特定の選択基準 (メッセージ識別子や相関識別子など) を使って、現在非破壊的にキューから取り出されているメッセージを検出する取り出し要求元も含まれています。

tpdequeue() からの出力時には、次の要素が TPQCTL 構造体に設定されます。

long flags;            /* どの値が
* 設定されるかの指定 */

long priority; /* 登録優先順位 */
char msgid[32]; /* キューから取り出されたメッセージの ID */
char corrid[32]; /* メッセージを識別するときに使用された相関識別子 */

long delivery_qos; /* 配信サービスの品質 */
long reply_qos; /* 応答メッセージのサービス品質 */
char replyqueue[16]; /* 応答のためのキュー名 */
char failurequeue[16]; /* 異常終了キューの名前 */
long diagnostic; /* 異常終了の原因 */
long appkey; /* アプリケーション認証用のクライアント
* キー */
long urcode; /* ユーザ戻り値 */
CLIENTID cltid; /* 発行元クライアント用のクライアント識別子 */

tpdequeue() からの出力情報を制御する flags パラメータの有効なビットの一覧を次に示します。これらのビットのいずれかについて、tpdequeue() の呼び出し時にフラグ・ビットをオンにしていると、その構造体の対応する要素には、メッセージがキューに登録されたときに指定された値が格納され、そのビットは設定されたままになります。値が使用できない (つまり、メッセージがキューに登録されたときに値が指定されなかった)場合、または tpdequeue() を呼び出したときにビットが設定されていない場合は、tpdequeue() はフラグをオフにして終了します。

TPQPRIORITY

このフラグが設定されていて tpdequeue() の呼び出しが正常終了し、メッセージが明示的な優先順位でキューに登録された場合、この優先順位が ctl->priority に格納されます。優先順位は 1 以上 100 以内の範囲内で数値が高いほど優先順位も高くなります (高い数値のメッセージが低い数値のメッセージよりも先にキューから取り出される)。優先順位が決まっていないキューの場合、値は情報にすぎません。

メッセージがキューに登録されるときに優先順位が明示的に指定されずに tpdequeue() 呼び出しが正常に終了した場合、このメッセージの優先順位は 50 になります。

TPQMSGID

このフラグが設定されていて tpdequeue() の呼び出しが正常終了した場合、メッセージ識別子が ctl->msgid に格納されます。メッセージ識別子の値は 32 バイト全体が意味を持ちます。

TPQCORRID

このフラグが設定されていて tpdequeue() の呼び出しが正常終了し、メッセージが相関識別子によってキューに登録された場合、この相関識別子が ctl->corrid に格納されます。相関識別子の値は 32 バイト全体が意味を持ちます。BEA Tuxedo ATMI/Q が提供するメッセージの応答には、すべて元の要求メッセージの相関識別子が付いています。

TPQDELIVERYQOS

このフラグが設定されていて tpdequeue() の呼び出しが正常終了し、メッセージが配信サービスの品質を指定されてキューに登録された場合、TPQQOSDEFAULTPERSISTTPQQOSPERSISTENTTPQQOSNONPERSISTENT のいずれかのフラグが ctl->delivery_qos に格納されます。メッセージがキューに登録されたときに配信サービスの品質が明示的に指定されていない場合は、対象となるキューのデフォルトの配信方針によってメッセージ配信の品質が決まります。

TPQREPLYQOS

このフラグが設定されていて tpdequeue() の呼び出しが正常終了し、メッセージが応答サービス品質によってキューに登録された場合は、TPQQOSDEFAULTPERSISTTPQQOSPERSISTENTTPQQOSNONPERSISTENT のいずれかのフラグが ctl->reply_qos に格納されます。メッセージがキューに登録されたときに応答のサービス品質が明示的に指定されていない場合、ctl-->replyqueue キューのデフォルトの配信方針によって、すべての応答に対する配信サービスの品質が決まります。

デフォルトの配信方針は、メッセージの応答がキューに登録されるときに決定されます。つまり、デフォルトの応答キューの配信方針が、元のメッセージがキューに登録されてからメッセージの応答がキューに登録されるまでの間に修正されると、応答が最終的にキューに登録されたときに有効だった方針が使用されます。

TPQREPLYQ

このフラグが設定されていて tpdequeue() の呼び出しが正常終了し、メッセージが応答キューによってキューに登録された場合、応答キューの名前が ctl->replyqueue に格納されます。メッセージへの応答はすべて、要求メッセージと同じキュー・スペース内の、指定された応答キューに入る必要があります。

TPQFAILUREQ

このフラグが設定されていて tpdequeue() の呼び出しが正常終了し、メッセージが異常終了キューによってキューに登録された場合、異常終了キューの名前が ctl->failurequeue に格納されます。すべての異常終了メッセージは、要求メッセージと同じキュー・スペース内の、指定された異常終了キューに入る必要があります。

flags パラメータの他のビット、TPQTOPTPQBEFOREMSGIDTPQTIME_ABSTPQTIME_RELTPQEXPTIME_ABSTPQEXPTIME_REL、および TPQEXPTIME_NONE は、tpdequeue() が呼び出されるとクリア (ゼロに設定) されます。これらのビットは、tpenqueue() の入力情報を制御する flags パラメータの有効なビットです。

tpdequeue() の呼び出しが異常終了して tperrno()TPEDIAGNOSTIC が設定された場合は、異常終了の原因を示す値が ctl->diagnostic に返されます。返される可能性のある値は、この後の「診断」の項で定義しています。

また出力時には、tpdequeue() 呼び出しが正常に終了すると、ctl->appkey にアプリケーション認証キーが設定され、ctl->cltid に要求の発信元であるクライアントの識別子が設定され、ctl->urcode にメッセージ登録時に設定されたユーザ戻り値が設定されます。

ctl パラメータが NULL である場合、入力フラグは TPNOFLAGS と見なされ、アプリケーション・プログラムは出力情報を利用できません。

戻り値

異常終了すると、tpdequeue() は -1 を返し、tperrno() を設定してエラー条件を示します。

エラー

異常終了時には、tpdequeue()tperrno() を次のいずれかの値に設定します(特に指定がない限り、障害は、呼び出し元のトランザクションに影響しません)。

[TPEINVAL]

無効な引数が指定されました (たとえば、qname が NULL である場合、data が、tpalloc() によって割り当てられた空間を指していない場合、flags が無効である場合など)。

[TPENOENT]

qspace が利用できない (つまり、対応する TMQUEUE(5) サーバが利用できない)ため qspace にアクセスできないか、またはグローバル・トランザクション・テーブル (GTT) のエントリが不足しているためにグローバル・トランザクションが開始できません。

[TPEOTYPE]

応答のタイプおよびサブタイプのいずれかが、呼び出し元にとって未知のものです。または、TPNOCHANGEflags に設定されているが、*data のタイプおよびサブタイプが、サービスによって送信された応答のタイプおよびサブタイプと一致しません。いずれの場合も、*data、その内容、および *len はいずれも変更されません。トランザクション・モードで呼び出しが行われたときにこのエラーが発生すると、トランザクションは「アボートのみ」とマークされ、メッセージはキューに残ります。

[TPETIME]

タイムアウトが発生しました。呼び出し元がトランザクション・モードの場合は、トランザクション・タイムアウトが発生し、トランザクションはアボートされます。トランザクション・モードにない場合は、ブロッキング・タイムアウトが発生しており、TPNOBLOCKTPNOTIME も指定されていませんでした。トランザクション・タイムアウトが発生すると、トランザクションがアボートされるまで、キューから新しいメッセージを取り出そうとしても常に TPETIME を示して異常終了します。

[TPEBLOCK]

ブロッキング状態のため、TPNOBLOCK が指定されました。

[TPGOTSIG]

シグナルを受け取りましたが、TPSIGRSTRT が指定されていません。

[TPEPROTO]

tpdequeue() が不正に呼び出されました。

[TPESYSTEM]

BEA Tuxedo システムのエラーが発生しました。エラーの正確な内容はログ・ファイルに書き込まれます。キューには影響ありません。

[TPEOS]

オペレーティング・システムのエラーが発生しました。キューには影響ありません。

[TPEDIAGNOSTIC]

指定されたキューからのメッセージの取り出しが異常終了しました。異常終了の原因は、ctl 構造体を介して返される診断値によって判別できます

診断

次の診断値は、キューからのメッセージの取り出し中に返されます。

[QMEINVAL]

無効なフラグ値が指定されました

[QMEBADRMID]

無効なリソース・マネージャ識別子が指定されました。

[QMENOTOPEN]

このリソース・マネージャは現在オープンしていません。

[QMETRAN]

トランザクション・モードで呼び出しが行われなかったため、または TPNOTRAN フラグを設定して呼び出したために、メッセージをキューから取り出すトランザクション開始のエラーが発生しました。この診断は、BEA Tuxedo リリース 7.1 以降のキュー・マネージャからは返されません。

[QMEBADMSGID]

キューからの取り出し用に、無効なメッセージ識別子が指定されました。

[QMESYSTEM]

システム・エラーが発生しました。エラーの正確な内容はログ・ファイルに書き込まれます。

[QMEOS]

オペレーティング・システムのエラーが発生しました。

[QMEABORTED]

操作は中断されました。グローバル・トランザクション内で実行されている場合、グローバル・トランザクションがロールバックのみとしてマークされています。それ以外の場合、キュ・ーマネージャは操作を中断しました。

[QMEPROTO]

トランザクション状態がアクティブでないときに、キューからの取り出しが行われました。

[QMEBADQUEUE]

無効または削除されたキューの名前が指定されました。

[QMENOMSG]

キューから取り出せるメッセージはありません。なお、メッセージがキュー上に存在し、別のアプリケーション・プロセスが、このメッセージをキューから読み取っていた可能性があることに注意してください。この場合は、その別のプロセスがトランザクションをロールバックしたときにメッセージはキューに戻されます。

[QMEINUSE]

相関識別子またはメッセージ識別子を使用してメッセージをキューから取り出す場合、ほかのトランザクションが指定したメッセージを使用しています。それ以外の場合、現在キューにあるメッセージはすべてほかのトランザクションによって使用中です。この診断は、BEA Tuxedo リリース 7.1 以降のキュー・マネージャからは返されません。

[QMESHARE]

指定されたキューからメッセージを取り出そうとしましたが、別のアプリケーションによってそのキューがオープンされています。別のアプリケーションとは、BEA Tuxedo システム以外の BEA 製品をベースとするアプリケーションであり、キューイング・サービス API (QSAPI) を使って排他的な読み書きのためのキューをオープンしています。

関連項目

qmadmin(1) tpalloc(3c)tpenqueue(3c)APPQ_MIB(5) TMQUEUE(5)

 

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