bea ホーム | 製品 | dev2dev | support | askBEA
BEA Logo Tuxedo
 ドキュメントのダウンロード   サイトマップ   用語集 
検索
0

Tuxedo C リファレンス

 Previous Next Contents View as PDF  

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

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

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

TPNOTIME

このフラグを設定すると、呼び出し元は無制限にブロックでき、ブロッキング・タイムアウトが適用されなくなります。ただし、トランザクション・タイムアウトは発生する可能性があります。

TPNOCHANGE

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

TPSIGRSTRT

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

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 によって指定された値を完全に初期化する必要があります (たとえば、NULL 文字で埋めるなど)。

TPQGETBYCORRID

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

TPQWAIT

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

要求する基準を満たすメッセージがすぐには利用できず、設定されたアクションのリソースを使い尽くしてしまった場合には、tpdequeue は -1 を返し tperrnoTPEDIAGNOSTIC に設定し、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() の呼び出しが異常終了して tperrnoTPEDIAGNOSTIC が設定された場合は、異常終了の原因を示す値が ctl—>diagnostic に返されます。返される可能性のある値は、この後の「診断」の項で定義しています。

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

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

戻り値

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

エラー

異常終了時には、tpdequeue()tperrno を次のいずれかの値に設定します(特に記述した場合を除いては、エラーが呼び出し元のトランザクションに影響を及ぼすことはありません)。

[TPEINVAL]

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

[TPENOENT]

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

[TPEOTYPE]

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

[TPETIME]

このエラー・コードは、タイムアウトが発生したか、または現在のトランザクションがすでに「ロールバックのみ」とマークされているにもかかわらず tpdequeue() が試行されたことを示します。

呼び出し元がトランザクション・モードにある場合、トランザクションはすでに「ロールバックのみ」になっているか、またはタイムアウトが発生しています (中途終了マークが付けられる)。呼び出し元がトランザクション・モードにない場合、ブロッキング・タイムアウトが発生しています。ブロッキング・タイムアウトは、TPNOBLOCK または TPNOTIME、あるいはその両方を指定した場合は発生しません。いずれのケースでも、*data、その内容、*len はどれも変更されません。

トランザクション・タイムアウトが発生すると、1 つの例外を除き、トランザクションがアボートされない限り、会話を継続したり、新しいリクエストを送信したり、未処理の応答を受信しようとしても、TPETIME で異常終了します。1 つの例外とは、ブロックされず、応答を期待せず、かつ呼び出し元のトランザクションのために送信されない (つまり、TPNOTRANTPNOBLOCK および TPNOREPLY が設定された状態で tpacall() が呼び出される場合) 要求です。

サービスがトランザクション内部で失敗すると、そのトランザクションは TX_ROLLBACK_ONLY 状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、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)

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy