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

Tuxedo C リファレンス

 Previous Next Contents View as PDF  

tpenqueue(3c)

名前

tpenqueue()−メッセージをキューに登録するルーチン

形式

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

機能説明

tpenqueue() は、キュー・スペース qspace 内の qname で指定されるキューに、メッセージを格納します。キュー・スペースは、キューを集めたもので、そのうちの 1 つのキューが qname でなければなりません。

メッセージが BEA Tuxedo ATMI システムのサーバを対象としている場合、qname は、サーバによって提供されるサービスの名前に一致します。システムが提供するサーバである TMQFORWARD(5) は、メッセージをキューから取り出し、キューと同じ名前のサービスを提供するサーバに、そのメッセージを転送するデフォルトの機構となります。発信元が応答を期待していた場合は、転送されたサービス要求への応答は、特に指定されている場合を除き、発信元のキューに格納されます。発信元は、続いて応答メッセージをキューから取り出します。キューは、任意の 2 つの BEA Tuxedo ATMI システムのプロセス間 (クライアントやサーバ) における信頼性の高いメッセージ転送機構用としても使用できます。この場合、キューの名前はサービス名ではなく、メッセージ転送ついて承認されている何らかの資格と一致します。

data が NULL 以外である場合、これは事前に tpalloc() によって割り当てられたバッファを指さなければならず、len は、キューに登録されるバッファ内のデータの大きさを指定しなければなりません。長さを指定する必要のないタイプのバッファ (FML フィールド化バッファなど) を data が指す場合、len は無視されます。data が NULL の場合、len は無視され、データ部分なしでメッセージはキューに登録されます

メッセージは、qspace について定義された優先順位が事前の tpsprio() の呼び出しによって無効化されていないかぎり、この優先順位でキューに登録されます。

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

呼び出し元がトランザクション・モードにないか、または TPNOTRAN フラグが設定されている場合は、メッセージはトランザクション・モードではキューに登録されません。tpenqueue() が正常終了すれば、出されたメッセージが処理されることが保証されます。トランザクション・モードでないときに通信エラーまたはタイムアウトが発生した場合、アプリケーションには、メッセージが正しくキューに格納されたかどうかがわかりません。

メッセージが処理される順序は、この後説明するように、ctl データ構造体を介してアプリケーションによって制御されます。デフォルトのキューの順序は、キューの作成時に設定されます。

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

TPNOTRAN

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

TPNOBLOCK

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

TPNOBLOCK が設定されていない場合に、ブロッキング状態が存在すると、その状態が解消されるかタイムアウト (トランザクション・タイムアウトまたはブロッキング・タイムアウト) が発生するまで、呼び出し元はブロックされます。タイムアウトが発生すると、呼び出しは異常終了し、tperrnoTPETIME に設定されます。

TPNOTIME

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

TPSIGRSTRT

このフラグが設定されていて、基本となるシステム・コールがシグナルによって中断された場合、中断されたシステム・コールは再発行されます。TPSIGRSTRT が指定されておらず、システム・コールがシグナルによって中断された場合、tpenqueue() は異常終了し、tperrnoTPGOTSIG が設定されます。

キューへのメッセージ登録に関する追加情報は、ctl データ構造体を介して指定できます。この情報には、デフォルトのキューの順序を無効にしてキューの先頭または登録済みのメッセージの前にメッセージを登録するための値、キューからメッセージを取り出すまでの絶対時間または相対時間、メッセージが期限切れになりキューから削除される絶対時間または相対時間、メッセージ配信サービスの品質、メッセージが応答する際のサービス品質、メッセージとそのメッセージに関連付けられた応答または異常終了メッセージを結び付けるときに役立つ相関識別子、応答を登録するキューの名前、およびすべての異常終了メッセージを登録するキューの名前が含まれます。

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

制御パラメータ

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

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

long flags;            /* どの値が  
* 設定されるかの指定 */
long deq_time; /* キューから取り出すときの絶対時間/相対時間 */
long priority; /* 登録優先順位 */
long exp_time /* 有効期限 */
long delivery_qos /* 配信サービスの品質 */
long reply_qos /* 応答サービスの品質 */
long urcode; /* ユーザ戻り値 */
char msgid[32]; /* 既存メッセージの ID
* (要求をそのメッセージの前に登録するため) */
char corrid[32]; /* msg を識別するときに使用される
* 相関識別子 */
char replyqueue[16]; /* 応答メッセージ用キューの名前 */
char failurequeue[16]; /* 異常終了メッセージ用キューの名前 */

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

TPNOFLAGS

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

TPQTOP

このフラグを設定すると、キューの順序付けは無効になり、メッセージはキューの先頭に登録されます。この要求は、順序付けを無効にするようにキューが設定されているかどうかによって、使用できない場合があります。TPQTOPTPQBEFOREMSGID は、相互に排他的なフラグです。

TPQBEFOREMSGID

このフラグを設定すると、キューの順序はオーバーライドされ、メッセージは ctl—>msgid によって識別されるメッセージの前に登録されます。この要求は、順序付けを無効にするようにキューが設定されているかどうかによって、使用できない場合があります。TPQTOPTPQBEFOREMSGID は、相互に排他的なフラグです。また、メッセージ識別子の値は 32 バイト全体が意味を持つため、ctl—>msgid によって指定された値を完全に初期化する必要があります (たとえば、NULL 文字で埋めるなど)。

TPQTIME_ABS

このフラグが設定されると、メッセージは ctl—>deq_time によって指定された時間の後で使用可能になります。deq_time は、time(2)、mktime(3C)、または gp_mktime(3c) によって生成された絶対時間値です (UTC (協定世界時) 1970 年 1 月 1 日 00:00:00 から経過した秒数)。TPQTIME_ABSTPQTIME_REL は、相互に排他的なフラグです。絶対時間は、キュー・マネージャ・プロセスが存在するマシン・クロックによって決定されます。

TPQTIME_REL

このフラグを設定すると、メッセージは、キューへの登録操作が完了してからの相対時間経過後に使用可能になります。ctl—>deq_time は、キューの登録が完了した後、出された要求が処理されるまでの遅延秒数を指定します。TPQTIME_ABSTPQTIME_REL は、相互に排他的なフラグです。

TPQPRIORITY

このフラグを設定すると、メッセージがキュー・スペースに登録される際の優先順位が、ctl—>priority に格納されます。優先順位は、1 以上 100 以下の範囲でなければなりません。数値が高いほど優先順位も高くなり、高い数値のメッセージが低い数値のメッセージより先にキューから取り出されます。優先順位によって順序付けられていないキューでは、この値は参考として使用されます。

このフラグを設定しなかった場合、メッセージの優先順位はデフォルトの 50 になります。

TPQCORRID

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

TPQREPLYQ

このフラグが設定されると、ctl—>replyqueue で指定された応答キューは、待機メッセージに関連付けられます。メッセージに対する応答はすべて、要求メッセージと同じキュー・スペース内の、指定されたキューに登録されます。この文字列は、NULL で終了しなければなりません (最大 15 文字)。

TPQFAILUREQ

このフラグが設定されると、ctl—>failurequeue で指定された異常終了キューは、待機メッセージに関連付けられます。(1) キューに登録されたメッセージが TMQFORWARD() によって処理され、(2) TMQFORWARD-d オプションで開始され、さらに (3) サービスが異常終了して NULL 以外の応答を返す場合は、その応答と関連する tpurcode によって構成される異常終了メッセージが、元の要求メッセージと同じキュー・スペース内で指定されたキューに登録されます。この文字列は NULL で終了し、15 文字以下であることが必要です。

TPQDELIVERYQOSTPQREPLYQOS

TPQDELIVERYQOS フラグが設定されていると、ctl->delivery_qos で指定されたフラグにより、メッセージの配信サービスの品質が制御されます。その場合、相互に排他的な 3 つのフラグ TPQQOSDEFAULTPERSISTTPQQOSPERSISTENTTPQQOSNONPERSISTENT のいずれかを ctl->delivery_qos に設定しなければなりません。TPQDELIVERYQOS フラグが設定されていない場合、ターゲットのキューのデフォルトの配信方針がメッセージに対するサービスの配信品質を指定します。

TPQREPLYQOS フラグが設定されていると、ctl->reply_qos で指定されるフラグが、メッセージの応答に対するサービスの品質を制御します。その場合、相互に排他的な 3 つのフラグ TPQQOSDEFAULTPERSISTTPQQOSPERSISTENTTPQQOSNONPERSISTENT のいずれかを ctl->reply_qos に設定しなければなりません。TPQREPLYQOS フラグは、TMQFORWARD によって処理されるメッセージから応答が返されるときに使用されます。サービスを呼び出すときに TMQFORWARD を使用しないアプリケーションでは、自身の応答メカニズムのヒントとして TPQREPLYQOS フラグを使用できます。

TPQREPLYQOS が設定されていない場合、ctl->replyqueue キューのデフォルトの配信方針によって、すべての応答の配信サービスの品質が決まります。デフォルトの配信方針は、メッセージに対する応答がキューに登録されるときに決定される点に注意してください。つまり、元のメッセージがキューに登録されてから応答が登録されるまでの間に、応答キューのデフォルトの配信方針が変更された場合、応答が最後に登録される時点で有効な方針が使用されます。

次に、ctl->delivery_qosctl->reply_qos の有効なフラグの値を示します。

TPQQOSDEFAULTPERSIST

このフラグは、ターゲットのキューで指定されているデフォルトの配信方針を使用して、メッセージが配信されるように指定します。

TPQQOSPERSISTENT

このフラグは、メッセージがディスク・ベースの配信方法を使用して、永続的な記憶域に配信されることを指定します。このフラグの設定は、ターゲット・キューに指定されているデフォルトの配信方針よりも優先されます。

TPQQOSNONPERSISTENT

このフラグは、メッセージがメモリ・ベースの配信方法を使用して、非永続的な記憶域に配信されることを指定します。特に、メッセージはキューから取り出されるまでメモリ内に登録されています。このフラグの設定は、ターゲット・キューに指定されているデフォルトの配信方針よりも優先されます。呼び出し元がトランザクション・モードの場合、非永続メッセージは呼び出し元のトランザクション内でキューに登録されます。ただし、システムがシャットダウンやクラッシュした場合、またはキュー・スペースとしての IPC 共用メモリが削除された場合、非永続メッセージは失われます。

TPQEXPTIME_ABS

このフラグが設定されていると、メッセージに有効期限の絶対時間が適用されます。これは、キューからメッセージが削除される絶対時間です。

有効期限の絶対時間は、キュー・マネージャ・プロセスが存在するマシン・クロックによって決定されます。

有効期限の絶対時間は、ctl->exp_time に格納された値で示されます。ctl->exp_time の値は、time(2)、mktime(3C)、または gp_mktime(3c) によって生成された絶対時間値に設定する必要があります (UTC (世界協定時) 1970 年 1 月 1 日 00:00:00 から経過した秒数)。

キューへの登録操作の時間より早い絶対時間が指定されると、操作は成功しますが、メッセージはしきい値の計算の対象になりません。有効期限の時間がメッセージの使用可能時間より前の場合、使用可能時間が有効期限の切れる時間より前になるようにいずれかの時間を変更しない限り、メッセージをキューから取り出すことはできません。また、これらのメッセージがキューからの取り出しの対象になったことがなくても、有効期限が切れるとキューから削除されます。トランザクション内でメッセージの期限が切れた場合、それによってトランザクションが異常終了することはありません。トランザクション内でキューへの登録、またはキューからの取り出し中に有効期限が切れたメッセージは、トランザクションが終了した時点でキューから削除されます。メッセージの有効期限が切れたことの通知は行われません。

TPQEXPTIME_ABSTPQEXPTIME_REL、および TPQEXPTIME_NONE は、相互に排他的なフラグです。この 3 つのどのフラグも設定されていない場合、ターゲットのキューに対応しているデフォルトの有効期限の時間がメッセージに適用されます。

TPQEXPTIME_REL

このフラグが設定されると、メッセージに相対有効期限が指定されます。つまり、メッセージがキューに到着した後の時間 (秒数) で、この時間が経過するとメッセージはキューから削除されます。有効期限の時間は、ctl->exp_time に格納された値で示されます。

有効期限の時間がメッセージの使用可能時間より前の場合、使用可能時間が有効期限の切れる時間より前になるようにいずれかの時間を変更しない限り、メッセージをキューから取り出すことはできません。また、これらのメッセージがキューからの取り出しの対象になったことがなくても、有効期限が切れるとキューから削除されます。トランザクション中にメッセージの期限が切れても、トランザクションが異常終了することはありません。トランザクション内でキューへの登録、またはキューからの取り出し中に有効期限が切れたメッセージは、トランザクションが終了した時点でキューから削除されます。メッセージの有効期限が切れたことの通知は行われません。

TPQEXPTIME_ABSTPQEXPTIME_REL、および TPQEXPTIME_NONE は、相互に排他的なフラグです。この 3 つのどのフラグも設定されていない場合、ターゲットのキューに対応しているデフォルトの有効期限の時間がメッセージに適用されます。

TPQEXPTIME_NONE

このフラグが設定されると、メッセージの有効期限がないことを示します。このフラグは、ターゲットのキューに対応付けられているデフォルトの有効期限の方針を上書きします。メッセージを削除する場合は、キューから取り出すか、管理インターフェイスを介して削除します。

TPQEXPTIME_ABSTPQEXPTIME_REL、および TPQEXPTIME_NONE は、相互に排他的なフラグです。この 3 つのどのフラグも設定されていない場合、ターゲットのキューに対応しているデフォルトの有効期限の時間がメッセージに適用されます。

また、TPQCTL の要素 urcode にユーザ戻り値を設定することができます。この値は、メッセージをキューから取り出すアプリケーションに返されます。

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

long flags;         /* どの値が  
* 設定されるかの指定 */
char msgid[32]; /* キューに登録されたメッセージの ID */
long diagnostic; /* 異常終了の原因 */

tpenqueue() からの出力情報を制御する flags パラメータの有効なビットの一覧を次に示します。tpenqueue() の呼び出し時にこのフラグ・ビットをオンにしていると、/Q サーバ TMQUEUE(5) によって構造体の関連要素にメッセージ識別子が設定されます。tpenqueue() の呼び出し時にこのフラグ・ビットをオフにしていると、TMQUEUE() によって構造体の関連要素にメッセージ識別子は設定されません。

TPQMSGID

このフラグが設定され、tpenqueue() の呼び出しが正常終了した場合は、メッセージ識別子が ctl—>msgid に格納されます。メッセージ識別子の値は 32 バイト全体が意味を持つため、ctl—>msgid に格納される値は完全に初期化されます (たとえば、NULL 文字で埋めるなど)。初期化に使用される実際の埋め文字は、BEA Tuxedo ATMI /Q コンポーネントのリリースによって異なります。

制御構造体の残りのメンバーは、tpenqueue() への入力に使用されません。

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

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

戻り値

異常終了すると、tpenqueue() は -1 を返し、tperrno を設定してエラー条件を示します。エラーでないときは、メッセージは、tpenqueue() の終了時に正しくキューに登録されます。

エラー

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

[TPEINVAL]

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

[TPENOENT]

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

[TPETIME]

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

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

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

サービスがトランザクション内部で失敗すると、そのトランザクションは TX_ROLLBACK_ONLY 状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。

[TPEBLOCK]

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

[TPGOTSIG]

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

[TPEPROTO]

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

[TPESYSTEM]

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

[TPEOS]

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

[TPEDIAGNOSTIC]

指定されたキューへのメッセージの登録が異常終了しました。異常終了の原因は、ctl を介して返される診断値によって判別できます。

診断

次の診断値は、キューへのメッセージの登録中に返されます。

[QMEINVAL]

無効なフラグ値が指定されています。

[QMEBADRMID]

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

[QMENOTOPEN]

リソース・マネージャが現在オープンされていません。

[QMETRAN]

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

[QMEBADMSGID]

無効なメッセージ識別子が指定されています。

[QMESYSTEM]

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

[QMEOS]

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

[QMEABORTED]

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

[QMEPROTO]

トランザクションの状態がアクティブではないときに、キューへの登録が行われました。

[QMEBADQUEUE]

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

[QMENOSPACE]

キュー上に領域がないなどリソース不足が原因で、サービスの品質 (永続的な記憶域または非永続的な記憶域) が指定されたメッセージがキューに登録されませんでした。次のいずれかのリソース設定を超えると、QMENOSPACE が返されます。(1) キュー・スペースに割り当てられたディスク容量 (永続的)、(2) キュー・スペースに割り当てられたメモリ容量 (非永続的)、(3) 同時にアクティブ状態になるトランザクションの最大数 (キュー・スペースで許容される数であることが必要です)、(4) キュー・スペースに一度に入れることができる最大メッセージ数、(5) キューイング・サービス・コンポーネントが処理できる並列アクションの最大数、または (6) キューイング・サービス・コンポーネントを同時に使用できる認証されたユーザの最大数。

[QMERELEASE]

新機能がサポートされていないバージョンの BEA Tuxedo システムのキュー・マネージャに対して、メッセージのキューへの登録が試みられました。

[QMESHARE]

指定されたキューにメッセージを登録しようとしましたが、別のアプリケーションによってキューが排他的にオープンされています。別のアプリケーションとは、BEA Tuxedo システム以外の BEA 製品に基づくもので、キューをオープンして、キューイング・サービス API (QSAPI) を使用して読み取りおよび書き込み、またはそのいずれかを排他的に行っています。

関連項目

qmadmin(1)gp_mktime(3c)tpacall(3c)tpalloc(3c)tpdequeue(3c)tpinit(3c)tpsprio(3c)APPQ_MIB(5)TMQFORWARD(5)TMQUEUE(5)

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy