BEA Logo BEA Tuxedo Release 8.0

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

 

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

 


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

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

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

TPNOTIME

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

TPSIGRSTRT

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

キューへのメッセージ登録に関する追加情報は、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

このフラグを設定すると、キューの順序は無効化され、メッセージはキューの先頭に位置付けられます。この要求は、キューが順序を無効化できるように構成されているかどうかに応じて、受け入れられない場合があります。TPQTOP および TPQBEFOREMSGID は、相互に排他的なフラグです。

TPQBEFOREMSGID

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

TPQTIME_ABS

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

TPQTIME_REL

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

TPQPRIORITY

このフラグを設定すると、メッセージがキュー・スペースに登録される際の優先順位が、ctl->priority に格納されます。優先順位は、1 以上 100 以下の範囲内でなければなりません。数値は高いほど優先順位も高くなります (高い数値のメッセージが低い数値のメッセージよりも先にキューに登録される)。優先順位が指定されていないキューについては、この値は情報にすぎません。

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

TPQCORRID

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

TPQREPLYQ

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

TPQFAILUREQ

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

TPQDELIVERYQOS, TPQREPLYQOS

TPQDELIVERYQOS フラグを設定した場合、ctl->delivery_qos によって指定されたフラグがメッセージの配信サービスの品質を制御します。この場合、3 つの相互に排他的なフラグ、TPQQOSDEFAULTPERSISTTPQQOSPERSISTENT、または TPQQOSNONPERSISTENT のいずれかが ctl->delivery_qos に設定されている必要があります。TPQDELIVERYQOS が設定されていない場合、ターゲット・キューのデフォルトの配信方針によってメッセージの配信サービスの品質が決まります。

TPQREPLYQOS フラグが設定されている場合、ctl->reply_qos で指定されたフラグによってメッセージ応答のサービス品質が制御されます。この場合、3 つの相互に排他的なフラグ、TPQQOSDEFAULTPERSISTTPQQOSPERSISTENT、または TPQQOSNONPERSISTENT のいずれかが ctl->reply_qos によって設定されている必要があります。TPQREPLYQOS フラグが使用されるのは、TMQFORWARD によって処理されたメッセージから応答が返る場合です。TMQFORWARD を使用してサービスを呼び出していないアプリケーションは、独自の応答機構のヒントとして TPQREPLYQOS フラグを使用することができます。

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

次に ctl->delivery_qosctl->reply_qos の有効な flags の値を示します。

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 は、相互に排他的なフラグです。どのフラグも設定されていない場合、ターゲット・キューに関連付けられているデフォルトの有効期限がメッセージに適用されます。

TPQEXPTIME_REL

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

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

TPQEXPTIME_ABSTPQEXPTIME_REL、および TPQEXPTIME_NONE は、相互に排他的なフラグです。どのフラグも設定されていない場合、ターゲット・キューに関連付けられているデフォルトの有効期限がメッセージに適用されます。

TPQEXPTIME_NONE

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

TPQEXPTIME_ABSTPQEXPTIME_REL、および TPQEXPTIME_NONE は、相互に排他的なフラグです。どのフラグも設定されていない場合、ターゲット・キューに関連付けられているデフォルトの有効期限がメッセージに適用されます。

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

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

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

char msgid[32]; /* id of enqueued message */
long diagnostic; /* 異常終了の原因 */

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

TPQMSGID

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

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

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

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

戻り値

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

エラー

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

[TPEINVAL]

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

[TPENOENT]

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

[TPETIME]

タイムアウトが発生しました。呼び出し元がトランザクション・モードの場合は、トランザクション・タイムアウトが発生し、トランザクションはアボートされます。トランザクション・モードにない場合は、ブロッキング・タイムアウトが発生しており、TPNOBLOCKTPNOTIME も指定されていませんでした。トランザクション・タイムアウトが発生すると、トランザクションがアボートされるまで、キューに新しいメッセージを登録しようとしても常に 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) キュー・スペースが 1 度に保持できる最大メッセージ数、(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)

 

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