リファレンス・ガイド

     前  次    新規ウィンドウで目次を開く    PDFとして表示 - 新規ウィンドウ  Adobe Readerを取得 - 新規ウィンドウ
コンテンツはここから始まります

Oracle Tuxedo Message Queue
関数リファレンス

表1-1 Oracle Tuxedo Message Queueの関数
名前
説明
キューからメッセージをデキューするルーチン。
メッセージをエンキューするルーチン。
アプリケーション・プログラムをメッセージ・キューにアタッチすることにより、OTMQのメッセージ・キュー・スペースに接続します。
選択したメッセージ・キューまたはそのアプリケーションのすべてのメッセージ・キューを、メッセージのキューイング・スペースからデタッチします。
実行時に、キュー名をキューの参照に動的に関連付けます。
指定されたキュー名またはキューのエイリアスに対応するキュー名を探します。
標準のOTMQ配信モードを使用して、メッセージをターゲットqspaceのターゲット・キューに送信します。
選択されたキューから次の使用可能なメッセージを取得し、それをデータ引数で指定された場所に移動します。
トピック・データのパブリッシュに使用します。
トピックのサブスクライブに使用します。
サブスクリプションの削除に使用します。
明示的な確認を必要とするメッセージの受信を確認します。
アプリケーションの開発者が、メッセージを受け取るための複雑な選択基準を定義できます。
以前に生成された選択マスクに関連付けられている選択配列およびインデックス・ハンドルを解放します。
OTMQのローカル・グループ・ジャーナルからメッセージを読み取ります。
選択されたキューのリストの保留中メッセージの数をリクエストします。
メッセージ受信の非同期通知をリクエストします。
sel_filter引数で指定された値に一致するすべての保留中tpqgetmsgaリクエストを取り消します。
OTMQシステム・コールのerrnoを取得します。
アプリケーションとOTMQキュー・サービス間のすべてのアタッチメントを終了します。
Oracle Tuxedo Message Queueのエラー・メッセージ文字列の詳細を取得します。

 


tpdequeue()

名前

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

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.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に設定されます。後者の場合、Oracle Tuxedo ATMIシステム以外のOracle製品をベースとするアプリケーションが、キューイング・サービスAPI (QSAPI)を使用した排他的な読取り/書込みのためのキューをオープンしています。
TPNOBLOCKが設定されていない場合に、ブロッキング状態が存在すると、その状態が解消されるかタイムアウト(トランザクション・タイムアウトまたはブロッキング・タイムアウト)が発生するまで、呼出し側はブロックされます。(TPQCTL構造体の) flagsTPQWAITオプションが指定されている場合は、このブロッキング条件には、キュー自体のブロッキングは含まれません。

TPNOTIME

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

TPNOCHANGE

このフラグが設定されていると、*dataが指すバッファのタイプは変更されません。デフォルトでは、*dataが指すバッファとは異なるタイプのバッファが受信されると、受信側が着信バッファのタイプを識別するかぎり、*dataのバッファ・タイプは、受信されたバッファのタイプに変更されます。つまり、受信されたバッファのタイプおよびサブタイプは、*dataが指すバッファのタイプおよびサブタイプと一致する必要があります。

TPSIGRSTRT

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

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

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

制御パラメータ

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

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

long flags;            /* indicates which of the values
* are set */
char msgid[32]; /* ID of message to dequeue */
char corrid[32]; /* correlation identifier of
* message to dequeue */

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

TPNOFLAGS

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

TPQGETBYMSGID

このフラグを設定すると、ctl矢印記号msgidによって指定されたメッセージ識別子を持つメッセージのエキューをリクエストします。メッセージ識別子は、事前のtpenqueue()呼出しによって戻されます。メッセージが別のキューに移動すると、メッセージ識別子が変わることに注意してください。また、メッセージ識別子の値は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;            /* indicates which of the values 
* should be set */

long priority; /* enqueue priority */
char msgid[32]; /* ID of message dequeued */
char corrid[32]; /* correlation identifier used to
* identify the message */
long delivery_qos; /* delivery quality of service */
long reply_qos; /* reply message quality of service */
char replyqueue[16]; /* queue name for reply */
char failurequeue[16]; /* queue name for failure */
long diagnostic; /* reason for failure */
long appkey; /* application authentication client
* key */
long urcode; /* user-return code */
CLIENTID cltid; /* client identifier for originating
* client */

次は、tpdequeue()からの出力情報を制御するflagsパラメータの有効なビットです。どのフラグ・ビットでも、tpdequeue()の呼出し時にオンになっていると、メッセージがエンキューされたときに提供された値が、構造体の関連する要素に格納され、そのビットは設定されたままになります。値が使用できない場合、またはtpdequeue()を呼び出したときにビットが設定されなかった場合、tpdequeue()はフラグがオフの状態で完了します。

TPQPRIORITY

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

TPQMSGID

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

TPQCORRID

このフラグが設定されていてtpdequeue()の呼出しが正常終了し、メッセージが相関識別子によってエンキューされた場合、この相関識別子がctl矢印記号corridに格納されます。相関識別子の値は、32バイト全体が意味を持ちます。Oracle Tuxedo ATMI /Qが提供するメッセージの応答には、すべて元のリクエスト・メッセージの相関識別子が付いています。

TPQDELIVERYQOS

このフラグが設定され、tpdequeue()の呼出しが成功し、メッセージがサービスの配信品質とともにキューに登録されていた場合、TPQQOSDEFAULTPERSISTTPQQOSPERSISTENT、またはTPQQOSNONPERSISTENTフラグがctl->delivery_qosに格納されます。メッセージがキューに登録されたときに配信サービスの品質が明示的に指定されていない場合は、ターゲットとなるキューのデフォルトの配信ポリシーによってメッセージ配信の品質が決まります。

TPQREPLYQOS

このフラグが設定され、tpdequeue()の呼出しが成功し、メッセージがサービスの応答品質とともにキューに登録されていた場合、TPQQOSDEFAULTPERSISTTPQQOSPERSISTENT、またはTPQQOSNONPERSISTENTフラグがctl->reply_qosに格納されます。メッセージがキューに登録されていたときに応答のサービス品質が明示的に指定されていない場合、ctl->replyqueueキューのデフォルトの配信ポリシーによって、すべての応答に対する配信サービスの品質が決まります。
デフォルトの配信ポリシーは、メッセージに対する応答がキューに登録されるときに決定される点に注意してください。つまり、元のメッセージがキューに登録されてからメッセージに対する応答が登録されるまでの間に、応答キューのデフォルトの配信ポリシーが変更された場合、応答が最後に登録される時点で有効なポリシーが使用されます。

TPQREPLYQ

このフラグが設定されていてtpdequeue()の呼出しが正常終了し、メッセージが応答キューによってエンキューされた場合、応答キューの名前がctl矢印記号replyqueueに格納されます。メッセージへの応答は、リクエスト・メッセージと同じキュー・スペース内の指定されたキューに登録されます。

TPQFAILUREQ

このフラグが設定されていてtpdequeue()の呼出しが正常終了し、メッセージが失敗キューによってエンキューされた場合、失敗キューの名前がctl矢印記号failurequeueに格納されます。異常終了メッセージは、リクエスト・メッセージと同じキュー・スペース内の指定された異常終了キューに登録されます。

flagsパラメータの残りのビットは、tpdequeue()が呼び出されるとクリア(0に設定)されます。これには、TPQTOPTPQBEFOREMSGIDTPQTIME_ABSTPQTIME_RELTPQEXPTIME_ABSTPQEXPTIME_REL、およびTPQEXPTIME_NONEが含まれます。これらのビットは、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]

qspaceを利用できないので、これにアクセスできません(関連するTuxMsgQサーバーは利用できません)。または、グローバル・トランザクション・テーブル(GTT)にエントリがないので、グローバル・トランザクションを開始できません。

[TPEOTYPE]

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

[TPETIME]

このエラー・コードは、タイムアウトが発生したか、または現在のトランザクションがすでに「ロールバックのみ」とマークされているにもかかわらずtpdequeue()が試行されたことを示します。
呼出し側がトランザクション・モードの場合、トランザクションはすでにロールバックのみであるか、またはトランザクション・タイムアウトが発生しました。このトランザクションは、「アボートのみ」とマークされます。呼出し側がトランザクション・モードでない場合、ブロッキング・タイムアウトが発生しています。(ブロッキング・タイムアウトは、TPNOBLOCKまたはTPNOTIMEが指定されている場合は発生しません。)いずれのケースでも、*data、その内容、*lenはいずれも変更されません。 トランザクション・タイムアウトが発生すると、1つの例外を除き、トランザクションが中断されないかぎり、会話を継続したり、新しいリクエストを送信したり、未処理の応答を受信しようとしても、TPETIMEで失敗します。その例外とは、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのかわりに送信されない(つまり、TPNOTRANTPNOBLOCKおよびTPNOREPLYを設定してtpacall()を呼び出した場合の)リクエストです。 サービスがトランザクションの内部で失敗した場合、そのトランザクションはTX_ROLLBACK_ONLY状態に置かれます。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降のATMI呼出しは、TPETIMEで異常終了します(前の段落で説明した例外を除く)。

[TPEBLOCK]

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

[TPGOTSIG]

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

[TPEPROTO]

tpdequeue()が不正に呼び出されました。キューまたはトランザクションには影響ありません。

[TPESYSTEM]

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

[TPEOS]

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

[TPEDIAGNOSTIC]

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

診断

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

[QMEINVAL]

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

[QMEBADRMID]

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

[QMENOTOPEN]

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

[QMETRAN]

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

[QMEBADMSGID]

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

[QMESYSTEM]

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

[QMEOS]

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

[QMEABORTED]

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

[QMEPROTO]

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

[QMEBADQUEUE]

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

[QMENOMSG]

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

[QMEINUSE]

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

[QMESHARE]

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

関連項目

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

 


tpenqueue()

名前

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

シノプシス

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

説明

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

メッセージがOracle Tuxedo ATMIシステムのサーバーを対象としている場合、qnameは、サーバーによって提供されるサービスの名前に一致します。システムが提供するサーバーであるTMQFORWARDPLUSは、メッセージをキューから取り出し、キューと同じ名前のサービスを提供するサーバーにそのメッセージを転送するデフォルトのメカニズムとなります。発信元が応答を期待していた場合は、転送されたサービス・リクエストへの応答は、特に指定されている場合を除き、発信元のキューに格納されます。発信元は、後で応答メッセージをキューから取り出します。キューは、任意の2つのOracle Tuxedo ATMIシステムのプロセス間(クライアントやサーバー)における信頼性の高いメッセージ転送メカニズム用としても使用できます。この場合、キューの名前はサービス名とは一致せず、メッセージ転送のための名前に関連します。

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

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

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

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

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

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

TPNOTRAN

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

TPNOBLOCK

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

TPNOTIME

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

TPSIGRSTRT

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

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

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

制御パラメータ

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

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

long flags;            /* indicates which of the values  
* are set */
long deq_time; /* absolute/relative for dequeuing */
long priority; /* enqueue priority */
long exp_time /* expiration time */
long delivery_qos /* delivery quality of service */
long reply_qos /* reply quality of service */
long urcode; /* user-return code */
char msgid[32]; /* ID of message before which to queue
* request */
char corrid[32]; /* correlation identifier used to
* identify the msg */
char replyqueue[16]; /* queue name for reply message */
char failurequeue[16]; /* queue name for failure message */

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

TPNOFLAGS

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

TPQTOP

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

TPQBEFOREMSGID

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

TPQTIME_ABS

このフラグが設定されると、メッセージはctl矢印記号deq_timeによって指定された時間の後で使用可能になります。deq_timeは、time(2)、mktime(3)、または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;         /* indicates which of the values  
* are set */
char msgid[32]; /* ID of enqueued message */
long diagnostic; /* indicates reason for failure */

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

TPQMSGID

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

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

tpenqueue()の呼出しが失敗してtperrnoTPEDIAGNOSTICが設定された場合は、失敗の原因を示す値がctl矢印記号diagnosticに戻されます。戻される可能性のある値は、この後の「診断」の項で定義しています。

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

戻り値

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

エラー

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

[TPEINVAL]

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

[TPENOENT]

qspaceを利用できないので、これにアクセスできません(関連するTMQUEUE(5)サーバーは利用できません)。または、グローバル・トランザクション表(GTT)にエントリがないので、グローバル・トランザクションを開始できません。

[TPETIME]

このエラー・コードは、タイムアウトが発生したか、または現在のトランザクションがすでに「ロールバックのみ」とマークされているにもかかわらずtpenqueue()が試行されたことを示します。
呼出し側がトランザクション・モードの場合、トランザクションはすでにロールバックのみであるか、またはトランザクション・タイムアウトが発生しました。このトランザクションは、「アボートのみ」とマークされます。呼出し側がトランザクション・モードでない場合、ブロッキング・タイムアウトが発生しています。(ブロッキング・タイムアウトは、TPNOBLOCKまたはTPNOTIMEが指定されている場合は発生しません。) トランザクション・タイムアウトが発生した場合、トランザクションがアボートされないかぎり、新しいリクエストの送信や未処理の応答の受信はできず、TPETIMEが発生します。その例外とは、ブロックされず、応答を期待せず、かつ呼出し側のトランザクションのかわりに送信されない(つまり、TPNOTRANTPNOBLOCKおよびTPNOREPLYを設定してtpacall()を呼び出した場合の)リクエストです。 サービスがトランザクション内部で失敗すると、そのトランザクションはTX_ROLLBACK_ONLY状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降のATMI呼出しは、TPETIMEで異常終了します(前の段落で説明した例外を除く)。

[TPEBLOCK]

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

[TPGOTSIG]

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

[TPEPROTO]

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

[TPESYSTEM]

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

[TPEOS]

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

[TPEDIAGNOSTIC]

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

診断

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

[QMEINVAL]

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

[QMEBADRMID]

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

[QMENOTOPEN]

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

[QMETRAN]

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

[QMEBADMSGID]

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

[QMESYSTEM]

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

[QMEOS]

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

[QMEABORTED]

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

[QMEPROTO]

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

[QMEBADQUEUE]

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

[QMENOSPACE]

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

[QMERELEASE]

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

[QMESHARE]

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

関連項目

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

 


tpqattach()

名前

tpqattach() - アプリケーション・プログラムをメッセージ・キューにアタッチすることにより、OTMQのメッセージ・キュー・スペースに接続します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqattach (qspace, queue, ctl, qattachctl, flags)

説明

メッセージ・キュー・スペースは、システム、共有グローバル・メモリー・セクションおよびファイルに存在するメッセージ・キューのコレクションで、同じサーバー・プロセスによって処理されます。OTMQのメッセージ・キューは、メッセージが格納および取得されるメモリーまたはディスクの領域です。OTMQ環境の構成方法については、ご使用のプラットフォーム用のインストレーションおよび構成ガイドを参照してください。

OTMQメッセージを受信するには、少なくとも1つのメッセージ・キューにアタッチする必要があります。アプリケーションは、tpqattach関数により、次の手順でアタッチできます。

アプリケーションでは、プライマリまたはセカンダリのアタッチメントを指定できます。すべてのアプリケーションにはプライマリ・キューがあります。それに加え、1つ以上のセカンダリ・キューにアタッチできます。プライマリ・キューは、キューの作成コマンドでセカンダリ・キューの所有者として構成できます。セカンダリ・キューの所有者であるプライマリ・キューにアタッチすると、プライマリ・キューにアタッチされるのと同時に、そのアプリケーションは自動的にセカンダリ・キューにもアタッチされます。

それに加え、複数リソースのキューにアタッチできます。複数リソースのキューは、多くのアプリケーションからの読取りが可能で、グループ定義の一部として構成されます。

表1-2に、tpqattach()がサポートする引数を示します。

表1-2 tpqattach()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
qspace
char
参照
char*
渡される
queue
char
参照
char*
渡される/戻される
ctl
TPQCTL
参照
TPQCTL*
渡される/戻される
Qattachctl
Q_ATTACH_CTL
参照
Q_ATTACH_CTL *
渡される
Flags
long
参照
Long
渡される

qspace

メッセージをエンキューするためのキュー・スペース名を指定します。最大長は15です。

queue

attach_mode引数でキュー名またはキューのエイリアスによるアタッチメントが指定された場合に、アプリケーションにアタッチする永続キューの名前を指定します。キュー名は、途中に空白を含まない英数字の文字列で、特殊文字としてアンダースコア(_)、ハイフン(-)およびドル記号($)も使用できます。最大長は127です。
キュー名は、大文字/小文字が区別され、tmqadminのキューの作成コマンドで入力したキュー名と一致する必要があります。キュー名の例としては、QUEUE_1、high-priority、My$Queueなどがあります。

ctl

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

tpenqplus()への入力として、リスト1-1に示す要素がTPQCTL構造体に設定できます。

リスト1-1 tpenqplus()の要素

     long flags; /* indicates which of the values are set */
     long deq_time; /* absolute/relative time for dequeuing */
     long priority; /* enqueue priority */
     long diagnostic; /* indicates reason for failure */
     char msgid[TMMSGIDLEN]; /* id of message before which to queue */
     char corrid[TMCORRIDLEN];/* correlation id used to identify message */
     char replyqueue[TMQNAMELEN+1]; /* queue name for reply message */
     char failurequeue[TMQNAMELEN+1];/* queue name for failure message */
     CLIENTID cltid;    /* client identifier for originating client */
     long urcode; /* application user-return code */
     long appkey; /* application authentication client key */
     long delivery_qos; /* delivery quality of service */
     long reply_qos; /* reply message quality of service */
     long exp_time; /* expiration time */
     /* new members for TMQPlus */
     long block; /* specify block mode: WF, AK, NN */
     long DIP;    /* specify the delivery interesting point:MEM, SAF, DQF,      DEQ, ACK,      CONF      */
     long uma; /* undelivered message action */
     long msg_class; /* message class */
     long msg_type; /* message type */
     PSB status_block; /* message delivery control point and UMA status      block */
     long redeliver_count; /* the max count which the message can be      redelivered */
     long seq_number[2]; /* message seq number, which is decided in      client side to      decrease the TMQ load */
     long timeout; /* timeout value for block enq/deq operation */
     char src_qspace[TMQSNAMELEN+1]; /* the source QSpace name. */
     char src_qname[TMQNAMELEN+1]; /* the source queue name. */
     char tgt_qspace[TMQSNAMELEN+1]; /* the source QSpace name. */
     char tgt_qname[TMQNAMELEN+1]; /* the source queue name. */
     char orig_src_qspace[TMQSNAMELEN+1];/* the original source QSpace      name. */
     char orig_src_qname[TMQNAMELEN+1]; /* the original source queue name.      */
     char orig_tgt_qspace[TMQSNAMELEN+1];/* the original target QSpace      name. */
     char orig_tgt_qname[TMQNAMELEN+1]; /* the original target queue name.      */
     char hops; /* net hops */
     long opcode;
     long filter_idx;
     long user_tag;
     long geta_idx; /* index of pending pams_get_msga requests */
     long endian;
     long receipt_msg_type; /*used for uma message*/

Qattachctl

これは、アプリケーション・プログラムで、キューへのアタッチに関連するパラメータを渡すために使用します。リスト1-2に示す要素がQ_ATTACH_CTL構造体に設定できます。

リスト1-2 Q_ATTACH_CTLの要素
     TM32I attachmode;   /* Supplies the mode for attaching the application      to a message queue.*/ 
     TM32I qtype; /* Supplies the queue type for the attachment. */
     TM32I * namespace_list; /* Supplies a list of name tables to search      when the attach_mode argument. */
     TM32I namespace_list_len; /* Supplies the number of entries in      the name_space_list      argument. */
     long timeout; /* The number of OTMQ time units (1 second      intervals) to allow for the attach to complete. */

Flags

TPNOTRAN

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

TPNOBLOCK

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

TPNOTIME

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

TPSIGRSTRT

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

戻り値

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPETIME]

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

[TPEBLOCK]

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

[TPESYSTEM]

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

[TPEOS]

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

[TPEDIAGNOSTIC]

指定したキューへのアタッチに失敗しました。異常終了の原因は、ctlを介して返される診断値によって判別できます。
診断

[QMEINVAL]

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

[QMESYSTEM]

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

[QMEOS]

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

[QMEABORTED]

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

[QMEBADQUEUE]

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

 


tpqdetach()

名前

tpqdetach() - 選択したメッセージ・キューまたはそのアプリケーションのすべてのメッセージ・キューを、メッセージのキューイング・スペースからデタッチします。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqdetach ( qspace, queue, detach_opt_list, detach_opt_len, msg_flushed , flags)

説明

選択したメッセージ・キューまたはそのアプリケーションのすべてのメッセージ・キューを、メッセージのキューイング・スペースからデタッチします。アプリケーションがそのプライマリ・キューからデタッチすると、この関数によって、自動的にそのプライマリ・キューに定義されているすべてのセカンダリ・キューへのアタッチがデタッチされます。最後のメッセージ・キューがデタッチされると、アプリケーションは、自動的にOTMQメッセージをキューイングするqspaceからデタッチされます。

リカバリ可能メッセージングに暗黙的な確認を使用している場合、次に示す処理に先だって、最後のメッセージが確認済であることを保証する必要があります。

デタッチや終了の前に、確実に最後のメッセージを確認済にしないと、そのキューが再度アタッチされたときにメッセージが再配信されます。確実に確認を行う最も簡単な方法は、最後に受信したメッセージのPSBの配信ステータスを保存しておき、要求された確認ステータスをチェックして、そのメッセージが確認済になった後で終了することです。

表1-3に、tpqdetach()がサポートする引数を示します。

表1-3 tpqdetach()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
qspace
char
参照
char *
渡される
queue
char
参照
char *
渡される
detach_opt_list
int
参照
int *
渡される
detach_opt_len
int
参照
int
渡される
msg_flushed
int
参照
int *
戻される
flags
long
参照
long
渡される

qspace

デタッチするキューのキュー・スペースを指定します。この関数は、プライマリ、セカンダリおよび複数リソース・キューのデタッチに使用できます。

queue

デタッチするキュー名を指定します。

detach_opt_list

どのようにキューをデタッチするかの制御に使用するint値の配列を指定します。この引数には次のような事前定義済の定数があります。

TMQ_NOFLUSH_Q

入力パラメータのキューに関係なく、メモリーに格納されている保留中のメッセージをフラッシュせずにキューをデタッチします。デフォルトの処理は、デタッチする前にキュー内の保留中のメッセージをフラッシュします。複数リソース・キューからメッセージがフラッシュされることはありません。

TMQ_DETACH_ALL

アプリケーションのすべてのメッセージ・キューを、メッセージのキューイング・スペースからデタッチします。この定数を使用すると、tpqexit関数の呼出しと同じ処理が実行されます。

TMQ_CANCEL_SEL

デタッチしようとする1つまたは複数のキューを参照するすべての選択マスクを取り消します。このオプションを指定せず、選択マスクを取り消さない場合は、OTMQでは、デタッチしようとする1つまたは複数のキューを参照するすべての選択マスクが無効化されます。tpqcancelget関数を使用して、無効化された選択マスクを取り消す必要があります。

detach_opt_len

detach_opt_list配列内のint値の数を指定します。int値の最大数は32767です。

msgs_flushed

キューからフラッシュされたメッセージの数を受け取ります。メッセージ数の統計は、デフォルトですべてのシステムで有効になっているため、この値を正確に通知するために、UNIXおよびWindows NTシステムで統計を有効にする必要はありません。

flags

次に、有効なフラグの一覧を示します。

戻り値

異常終了すると、tpqdetach()は-1を返し、tperrnoを設定してエラーの状況を示します。そうでない場合は、tpqdetach()から戻ったとき、キューは正常にデタッチされています。

Errors:

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPETIME]

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

[TPEBLOCK]

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

[TPGOTSIG]

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

[TPEPROTO]

tpqdetach()の呼出し方法が不適切です。

[TPESYSTEM]

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

[TPEOS]

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

 


tpqbind()

名前

tpqbind() - 実行時に、キュー名をキューの参照に動的に関連付けます。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqbind (qspace , pNameCtl , scope, timeout);

説明

実行時に、キュー名をキューの参照に動的に関連付けます。これにより、サーバー・アプリケーションで実行時に動的にキューのエイリアスをサービスに登録できます。これによりエンド・ユーザーは、通常のホスト・コンピュータが停止しても、サービスが別のホスト・コンピュータで提供されていることを意識せずにサービスにアクセスできます。tpqbind()を使用するには、まずtpqattach()を呼び出す必要があります。

表1-4に、tpqbind()がサポートする引数を示します。

表1-4 tpqbind()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
qspace
char
参照
char *
渡される
pNameCtl
Q_NAME_CTL
参照
Q_NAME_CTL *
渡される
Scope
long
参照
long *
渡される
timeout
long
参照
long
渡される

qspace

バインドされるキュー・スペースを指定します。qspace引数は、tpqattach()のqspace引数と同じである必要があります。

pNameCtl

Q_NAME_CTL構造体は、アプリケーション・プログラムで、エイリアスのキュー名へのバインドに関連するパラメータを渡したり、取得したりするために使用します。

typedef struct {

char pName[TMQALIASLEN+1];

char pGroup[TMQSNAMELEN+1];

char pQueue[TMQNAMELEN+1];

TM32I nFlags;

TM32I nType; /* L/G */

TM32I type; /* client type */

TM32I nOwnerPid; /* client pid */

CLIENTID cltid;

TM32I * namespace_list; /* for using pams interface */

TM32I namespace_list_len; /* for using pams interface */} Q_NAME_CTL;

pName

バインドするエイリアスの名前で、グローバル・キュー参照またはローカル・キュー参照を識別します。

pGroup

バインドされるキュー・スペースを指定します。

pQueue

キュー名です。
注意: この引数で指定するpGroupおよびpQueueの値は、キュー名をバインドするか、アンバインドするかを制御します。
キューのpGroupおよびpQueueが指定されている場合、この関数はそれをpNameにバインドします。0が指定された場合、この関数はpNameをそのキュー名からアンバインドします。呼出し元アプリケーションは、pNameが再びゼロに設定されるまでpNameにバインドされています。

name_space_list

name_space_list引数も、次のようにキャッシュ・アクセスを制御します。
ローカル・キューの参照またはキュー名をルックアップするには、OTMQ_TBL_GRPOTMQ_TBL_PROCの両方を指定します。これにより、グループ・キャッシュを検索する前にプロセス・キャッシュがチェックされます。
グローバル・キューの参照をルックアップするには、OTMQ_TBL_BUS、OTMQ_TBL_GRPおよびOTMQ_TBL_PROCを指定します。これにより、プロセス・キャッシュがチェックされます。そして、グローバル・ネームスペースを検索する前にグループ・キャッシュがチェックされます。
マスター・データベースを検索する前に、グローバル・ネームスペース内のすべてのキャッシュをルックアップするには、OTMQ_TBL_BUSのかわりにOTMQ_TBL_BUS_LOWを指定する点に注意してください。
マスター・データベースを検索する前に、速度は遅くても最新のグローバル・ネームスペース内のキャッシュをルックアップするときにのみ、OTMQ_TBL_BUSのかわりにOTMQ_TBL_BUS_MEDIUMを指定します。

name_space_list_len

name_space_list引数のエントリの数を指定します。name_space_list_len引数がゼロの場合、デフォルトとして、name_space_list引数にOTMQ_TBL_GRPを使用します。

nFlags

CORE_FLAGS_BOUND: エイリアスをキュー名にバインドします。
CORE_FLAGS_CACHED: エイリアスをロケールの共有メモリーにキャッシュします。
CORE_FLAGS_LOCKED: エイリアスをロックします。ロックされている場合は、アクセスできません。

nOwnerPid

未使用

nType

未使用

cltid

未使用

scope

pNameのスコープを指定します。スコープの識別子には次のものがあります。
NAME_SCOPE_P: スコープはプロセス NAME_SCOPE_L: スコープはローカル NAME_SCOPE_G: スコープはグローバル
TPのAPIのscopeおよびnamespace_list引数は、scopeがNULLの場合、namespace_listもNULLに指定することはできず、scopeに値を指定した場合、namespace_listは無効になります。

timeout

アタッチの完了に許容するOTMQの時間単位(1秒間隔)です。NULLポインタが指定された場合、グループのアタッチ・サービスのBLOCKTIMEプロパティが使用されます(UBBCONFIGの*SERVICESセクションで構成されています)。サービス全体のBLOCKTIMEが構成されていない場合、UBBCONFIGの*RESOURCESセクションで指定されているシステム全体のBLOCKTIMEが使用されます(デフォルトは約60秒)。

戻り値

異常終了すると、tpqbind()は-1を返し、tperrnoを設定してエラーの状況を示します。そうでない場合は、tpqbind()から戻ったとき、キューのエイリアスは正常にバインドされています。

Errors:

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPETIME]

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

[TPEPROTO]

tpqbind()の呼出し方法が不適切です。たとえば、先にtpqattach()を呼び出していないのにtpqbindを呼び出した場合などです。

[TPESYSTEM]

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

[TPEOS]

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

 


tpqlocate()

名前

tpqlocate() - 指定されたキュー名またはキューのエイリアスに対応するキュー名を探します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqlocate (qspace, pNameCtl, req_id, resp_q, scope, wait_mode, timeout )

説明

指定されたキュー名またはキューのエイリアスに対応するキュー名を探します。デフォルトでは、この関数はキュー名が戻されるまで待機します。tpqlocate()を使用するには、まずtpqattach()を呼び出す必要があります。

表1-5に、tpqlocate()がサポートする引数を示します。

表1-5 tpqlocate()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
qspace
char
参照
char *
渡される
pNameCtl
pNameCtl
参照
pNameCtl *
渡される/戻される
req_id
long
参照
long
渡される
resp_q
char
参照
char *
渡される
scope
long
参照
long
渡される
wait_mode
long
参照
long
渡される
timeout
long
参照
long *
渡される

qspace

キュー名をリクエストするキュー・スペースを指定します。tpqattach()のqspace引数と同じである必要があります。

pNameCtl

Q_NAME_CTL構造体は、アプリケーション・プログラムで、エイリアスのキュー名へのバインドに関連するパラメータを渡したり、取得したりするために使用します。
typedef struct {
   char          pName[TMQALIASLEN+1];
   char          pGroup[TMQSNAMELEN+1];
   char          pQueue[TMQNAMELEN+1];
   TM32I         nFlags;
   TM32I         nType;         /* L/G */
   TM32I         type;          /* client type */
   TM32I         nOwnerPid;     /* client pid */
   CLIENTID      cltid;
TM32I       * namespace_list;        /* for using pams interface */
   TM32I         namespace_list_len;    /* for using pams interface */
} Q_NAME_CTL;

pName

バインドするエイリアスの名前で、グローバル・キュー参照またはローカル・キュー参照を識別します。

pGroup

エイリアスをバインドするqspaceの名前を指定します。

pQueue

エイリアスをバインドするキュー名を指定します。
この引数で指定されるpGroupおよびpQueueの値は、キュー名をバインドするか、アンバインドするかを制御します。

name_space_list

name_space_list引数も、次のようにキャッシュ・アクセスを制御します。
ローカル・キューの参照またはキュー名をルックアップするには、OTMQ_TBL_GRPとOTMQ_TBL_PROCの両方を指定します。これにより、qspaceキャッシュを検索する前にプロセス・キャッシュがチェックされます。
グローバル・キューの参照をルックアップするには、OTMQ_TBL_BUSOTMQ_TBL_GRPおよびOTMQ_TBL_PROCを指定します。これにより、プロセス・キャッシュがチェックされます。そして、グローバル・ネームスペースを検索する前にqspaceキャッシュがチェックされます。
注意: マスター・データベースを検索する前に、グローバル・ネームスペース内のすべてのキャッシュをルックアップするには、OTMQ_TBL_BUSのかわりにOTMQ_TBL_BUS_LOWを指定します。
マスター・データベースを検索する前に、速度は遅くても最新のグローバル・ネームスペース内のキャッシュをルックアップするときにのみ、OTMQ_TBL_BUSのかわりにOTMQ_TBL_BUS_MEDIUMを指定します。

name_space_list_len

name_space_list引数のエントリの数を指定します。引数のname_space_list_lenがゼロの場合、デフォルトとして、name_space_list引数にはOTMQ_TBL_GRPを使用します。

nFlags

CORE_FLAGS_BOUND: エイリアスをキュー名にバインドします。
CORE_FLAGS_CACHED: エイリアスをロケールの共有メモリーにキャッシュします。
CORE_FLAGS_LOCKED: エイリアスをロックします。

nOwnerPid

将来の使用のために予約されています

nType

将来の使用のために予約されています

cltid

将来の使用のために予約されています

wait_mode

tpqlocate関数の検索モードを指定します。このモードは、アプリケーションで検索の完了を待機するか、確認応答メッセージのレスポンスを受信するかを指定します。この引数には次の2つの事前定義済の定数があります。

req_id

アプリケーション固有のトランザクションIDを指定し、tpqlocate関数と関連付けます。

resp_q

キュー名の確認応答メッセージの受信に使用する別のキューを指定します。レスポンス・キューが指定されない場合、確認応答メッセージは送信元プログラムのプライマリ・キューに送信されます。
注意: 送信元プログラムでは、そのqspaceの外にあるレスポンス・キューは指定できません。 name_space_list引数もまたキャッシュ・アクセスを制御し、ローカル・キューの参照またはキュー名をルックアップするには、OTMQ_TBL_GRPOTMQ_TBL_PROCの両方を指定します。これにより、グループ・キャッシュを検索する前にプロセス・キャッシュがチェックされます。 グローバル・キューの参照をルックアップするには、OTMQ_TBL_BUS(あるいは、OTMQ_TBL_BUS_LOWまたはOTMQ_TBL_BUS_MEDIUM)、OTMQ_TBL_GRPおよびOTMQ_TBL_PROCを指定します。これにより、プロセス・キャッシュがチェックされます。そして、グローバル・ネームスペースを検索する前にグループ・キャッシュがチェックされます。 マスター・データベースを検索する前に、グローバル・ネームスペース内のすべてのキャッシュをルックアップするには、OTMQ_TBL_BUSのかわりにOTMQ_TBL_BUS_LOWを指定する点に注意してください。 マスター・データベースを検索する前に、速度は遅くても最新のグローバル・ネームスペース内のキャッシュをルックアップするときにのみ、OTMQ_TBL_BUSのかわりにOTMQ_TBL_BUS_MEDIUMを指定します。 name_space_list_len: name_space_list引数のエントリの数を指定します。引数のname_space_list_lenがゼロの場合、デフォルトとして、name_space_list引数にはOTMQ_TBL_GRPを使用します。

scope

pNameのスコープを指定します。
次のようにスコープを指定します。 NAME_SCOPE_P: スコープはプロセス NAME_SCOPE_L: スコープはローカル NAME_SCOPE_G: スコープはグローバル。 TPのAPIのscopeおよびnamespace_list引数は、scopeがNULLの場合、namespace_listもNULLに指定することはできず、scopeに値を指定した場合、namespace_listは無効になります。

timeout

アタッチの完了に許容するOTMQの時間単位(1秒間隔)です。NULLポインタが指定された場合、グループのアタッチ・サービスのBLOCKTIMEプロパティが使用されます(UBBCONFIGの*SERVICESセクションで構成されています)。サービス全体のBLOCKTIMEが構成されていない場合、UBBCONFIGの*RESOURCESセクションで指定されているシステム全体のBLOCKTIMEが使用されます(デフォルトは約60秒)。

戻り値

異常終了すると、tpqlocate()は-1を返し、tperrnoを設定してエラーの状況を示します。そうでない場合は、tpqlocate()から戻ったとき、キューは正常に検出されています。

Errors:

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPETIME]

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

[TPEPROTO]

tpqlocate()の呼出し方法が不適切です。

[TPESYSTEM]

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

[TPEOS]

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

 


tpenqplus()

名前

tpenqplus() - 指定されたキュー名またはキューのエイリアスに対応するキュー名を探します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpenqplus (qspace, qname, ctl, data, len, flags)

説明

標準のOTMQ配信モードを使用して、メッセージをターゲットqspaceのターゲット・キューに送信します。

TPQCTL構造体のblockおよびDIP引数は、システム、プロセスまたはネットワーク障害時のメッセージ配信の保証に使用できます。リカバリ可能メッセージは、受信側プログラムのターゲット・キューに配信できるまで、メッセージ・リカバリ・システムによってディスクに格納されています。リカバリ可能メッセージを送信するときは、メッセージ・リカバリがメッセージを格納できなかった場合のため、TPQCTL構造体のuma引数を指定する必要があります。また、操作の戻りステータスを受信するため、TPQCTL構造体のPSB引数も指定する必要があります。

オプションのtimeout引数により、関数がタイムアウトするまでの、送信操作完了のための最大時間を設定できます。オプションのTPQCTL構造体のreplyqueue引数により、レスポンスを送信側プログラムのプライマリ・キューに送るかわりに、レスポンス・メッセージを受信するための代替キューを指定できます。同期モードで、応答キューからのレスポンス・メッセージの受信に失敗すると、tpenqplus()でエラーが戻されますが、メッセージはターゲット・キューに正常に送信されている可能性はあります。

OTMQの機能を使用するには、tpenqplusを呼び出す前にtpqattachを呼び出す必要があります。tpenqplusのqspace引数は、tpqattachのqspace引数と同じである必要があります。

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

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

tpenqplus()を使用するには、まずtpqattach()を呼び出す必要があります。

表1-6に、tpenqplus()がサポートする引数を示します。

表1-6 tpenqplus()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
qspace
char
参照
char *
渡される
qname
char
参照
char *
渡される
ctl
TPQCTL
参照
TPQCTL *
渡される/戻される
data
char
参照
char *
渡される
len
long
参照
long
渡される
flags
long
参照
long
渡される

qspace

メッセージをエンキューするためのキュー・スペース名を指定します。最大長は15です。

qname

メッセージをエンキューするためのキュー名を指定し、最大長は127です。

制御パラメータ

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

flags

tpenqplus()の入力情報を制御するflagsパラメータの有効なビットの一覧を次に示します。
TPNOFLAGS
TPQTOPI
TPQBEFOREMSGID
TPQTIME_ABS
TPQTIME_REL
TPQPRIORITY
TPQCORRID
TPQREPLYQ
TPQFAILUREQ
TPQDELIVERYQOS、TPQREPLYQOS
TPQEXPTIME_ABS
TPQEXPTIME_REL
TPQEXPTIME_NONE
TPQMSGID
OTMQ
TPQGETBYFILTER
TPQGETMSGA
TPQREADJRN
TPQENDIAN
TPQGETBYSEQNUM

priority

選択的なメッセージ受信のための優先度のレベルを指定します。優先度の範囲は、0(低優先度)-99(高優先度)です。

msg_class

送信されるメッセージのクラス・コードを指定します。OTMQでは、クラス引数の値にシンボリック名が使用できます。シンボリックなクラス名はMSG_CLAS_で始まります。クラス・シンボルの定義の詳細は、tmqsym.hインクルード・ファイルを参照してください。UNIXおよびNTシステムでは、tmqsym.hインクルード・ファイルは編集できません。アプリケーションで使用するタイプおよびクラスのシンボルを定義するインクルード・ファイルを作成する必要があります。
次に示すのは、OTMQで予約されているクラス・シンボルです。
予約されているクラス・シンボルの値
MSG_CLAS_XXX 30000-32767 (31001-31003を除く)

msg_type

送信されるメッセージのタイプ・コードを指定します。OTMQでは、msg_type引数の値にシンボリック名が使用できます。シンボリックなタイプ名はMSG_TYPE_で始まります。タイプ・シンボルの定義の詳細は、tmqsym.hインクルード・ファイルを参照してください。
シンボルの値の範囲の-1から-5000はOTMQで予約されています。この引数の値がゼロの場合は、メッセージ・タイプによる処理は行われません。

block

次の形式を使用してメッセージの配信モードを指定します。
OTMQ_DEL_sn - このsnは、次に示す送信者通知の定数のうちの1つです。
WF - 完了の待機
AK - 非同期確認応答
NN - 非通知
注意: NNモードはトランザクションをサポートしないため、このモードでは自動的にTPNOTRANフラグが設定されます。

DIP

DIPは、次に示す配信インタレスト・ポイント定数のうちの1つです。
ACK - ターゲット・キューから読み取り、tpqconfirmmsg関数を使用して明示的に確認された。ACKは、受信側アプリケーションによる2番目のtpdeqplusの呼出しの後に送信される暗黙的な確認応答である場合もあります。
CONF - DQFから配信され、tpqconfirmmsg関数を使用して明示的に確認された(リカバリ可能)。
DEQ - ターゲット・キューから読み取られた。
DQF - 宛先のキュー・ファイルに格納された(リカバリ可能)。
MEM - Sターゲット・キューに格納された。
SAF - ストア・アンド・フォワード・ファイルに格納された(リカバリ可能)。
注意: 一時キューを使用していて、迅速な削除と再使用が行われる場合、まれな例として、以前の一時キューからの暗黙的なACKレスポンスが新規の一時キューに格納されることがあります。
OTMQ_DEL_WFおよびOTMQ_DIP_ACKを設定した場合、ACKメッセージはtpenqplusで読み取り、クライアントはACKメッセージを読み取るために別のAPIを呼び出す必要はありません。

timeout

アプリケーションに制御を戻す前にtpenqplus関数がメッセージが届くまで待機する時間の最大値を指定します。メッセージが届く前にタイムアウトが発生した場合、ステータス・コードOTMQ__TIMEOUTが戻されます。timeoutの値に0を指定すると、タイムアウトはデフォルト値の30秒に設定されます。

psb

最終的な完了ステータスを示すOTMQのステータス・ブロックの値を受け取ります。psb引数は、リカバリ可能メッセージの送受信時に使用されます。PSB構造体には、次のリスト1-3に示すようなメッセージ・リカバリ・システムからのステータス情報が格納され、メッセージの送受信の後にチェックできます。
リスト1-3 PSB構造体
Listing 1-3	 PSB Structure
	struct psb_t {
 	long type_of_psb;         /* PSB type */
	long del_psb_status;      /* The completion status of the function. It contains the status from TuxMsgQ. It can also contain a value of TPSUCCESS when the message is not sent recoverably. */
	long uma_psb_status;      /* The completion status of the undeliverable message action (UMA). The PSB UMA status indicates if the UMA was not executed or applicable. */
	long psb_reserved[6];     /* reserved filed */
	};
	typedef struct psb_t PSB;
	Note: this structure is already defined at atmi.h.

uma

指定した配信インタレスト・ポイントでメッセージが格納できなかった場合に実行されるアクションを指定します。この引数の形式はOTMQ_UMA_XXXで、このXXXは次に示すシンボルのうちの1つです。
シンボル:        説明
DISC:            メッセージの破棄
RTS:              送信者への返却
SAF:             ストア・アンド・フォワード
DLJ:              使用不能のレター・ジャーナル
DLQ:             配信不能キュー

replyqueue

受信側プログラムからのレスポンス・メッセージを受信するための代替キューに使用するq_nameを指定します。送信側プログラムでは、レスポンス・メッセージを受信するため、replyqueue引数に指定したキューにアタッチする必要があります。replyqueueを使用するには、フラグにTPQREPLYQを指定する必要があります。
送信側プログラムでは、そのqspaceの外にあるレスポンス・キューは割り当てられないことに注意してください。

correlation_id

相関識別子(32バイトの値として格納されるユーザー定義の識別子)を指定します。

seq_number

seq_number[0]またはseq_number[1]の値に「(long)0」が指定されていない場合、OTMQでは、そのメッセージのための一意の番号が生成されません。

data

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

len

dataがNULLでない場合のdataの長さです。

Flags

次に、有効なフラグの一覧を示します。

TPNOTRAN

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

TPNOBLOCK

ブロッキング状態が存在する場合、メッセージはキューに登録されません。このフラグが設定されていて、メッセージの転送先である内部バッファがいっぱいであるなどのブロッキング条件が存在する場合には、呼出しは異常終了し、tperrnoTPEBLOCKが設定されます。このフラグが設定されていて、ターゲットのキューが別のアプリケーションによって排他的にオープンされているなどのブロッキング条件が存在する場合には、呼出しは異常終了し、tperrnoTPEDIAGNOSTICが設定され、TPQCTL構造体の診断フィールドはQMESHAREに設定されます。
TPNOBLOCKが設定されていない場合に、ブロッキング状態が存在すると、その状態が解消されるかタイムアウト(トランザクション・タイムアウトまたはブロッキング・タイムアウト)が発生するまで、呼出し側はブロックされます。タイムアウトが発生すると、呼出しは異常終了し、tperrnoはTPETIMEに設定されます。

TPNOTIME

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

TPSIGRSTRT

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

戻り値

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

Errors:

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPETIME]

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

[TPEBLOCK]

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

[TPGOTSIG]

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

[TPEPROTO]

tpenqplus()の呼出し方法が不適切です。

[TPESYSTEM]

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

[TPEOS]

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

[TPEDIAGNOSTIC]

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

[QMEINVAL]

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

[QMEBADRMID]

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

[QMENOTOPEN]

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

[QMETRAN]

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

[QMEBADMSGID]

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

[QMESYSTEM]

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

[QMEOS]

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

[QMEABORTED]

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

[QMEPROTO]

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

[QMEBADQUEUE]

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

[QMENOSPACE]

キュー上に領域がないなどリソース不足が原因で、サービスの品質(永続的な記憶域または非永続的な記憶域)が指定されたメッセージがキューに登録されませんでした。

[QMERELEASE]

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

[QMBADDELIVERY]

無効な配信モードです。

[QMBADPRIORITY]

送信操作の無効な優先度の値です。

[QMBADPROCNUM]

無効なターゲット・キュー名の指定です。

[QMBADRESPQ]

レスポンス・キューがプロセスの所有ではありません。

[QMBADUMA]

配信不可メッセージ・アクション(UMA)が無効です。

[QMNOTSUPPORTED]

選択された配信モードとumaの組合せがサポートされていません。

 


tpdeqplus()

名前

tpdeqplus() - 選択されたキューから次の使用可能なメッセージを取得し、それをデータ引数で指定された場所に移動します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpdeqplus (qspace, qname, ctl, data, len, flags)

説明

選択されたキューから次の使用可能なメッセージを取得し、それをデータ引数で指定された場所に移動します。選択フィルタが指定されていない場合、この関数は、メッセージの優先度に基づき先入れ/先出し(FIFO)の順序で、data引数で指定されたバッファに次の使用可能なメッセージを戻します。優先度の範囲は、0(低優先度)-99(高優先度)です。たとえば、優先度1のメッセージは、常に優先度0のメッセージの前に置かれます。メッセージは、メッセージの優先度に基づき、先入れ/先出しの順序で配置されます。選択フィルタが指定されている場合、選択基準に一致するメッセージのみが取得されます。メッセージがない、または選択基準に一致するメッセージがない場合、戻りステータスはQMENOMSGになります。

アプリケーションでは、各メッセージのPSBのステータス・フィールドをチェックし、そのメッセージがリカバリ可能配信モードで送信されているかどうかを判断する必要があります。リカバリ可能メッセージを受信した場合、tpqconfirmmsg関数を呼び出し、メッセージ・リカバリ・ジャーナルのディスク記憶域からそのメッセージを削除します。リカバリ可能メッセージの受信が確認されない場合、そのメッセージはリカバリ・システムによって保持されたままになり、アプリケーションでそのキューからデタッチし、再びアタッチしたときに再配信されます。

tpdepplus()を使用するには、まずtpqattach()を呼び出す必要があります。

表1-7に、tpdepplus()がサポートする引数を示します。

表1-7 tpdepplus()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
qspace
char
参照
char *
渡される
qname
char
参照
char *
渡される
ctl
TPQCTL
参照
TPQCTL *
渡される/戻される
data
char
参照
char * *
戻される
len
long
参照
long *
渡される/戻される
flags
long
参照
long
渡される

qspace

メッセージをデキューするためのキュー・スペース名を指定します。最大長は15です。

qname

メッセージをエンキューするためのキュー名を指定します。最大長は127です。

data

dataはメッセージが読み込まれるバッファに対するポインタのアドレスで、lenはそのメッセージの長さを指します。*dataは、最初にtpalloc()によって割り当てられたバッファを指す必要があります。メッセージがtpdeqplusに渡されるバッファよりも大きい場合、バッファはメッセージを格納できる大きさまで拡張されます。メッセージ・バッファのサイズに変化があるかどうかを判別するには、tpdeqplus()が発行される前の(合計の)サイズを*lenと比較します。*lenのほうが大きい場合、バッファは拡張されており、そうでない場合は、バッファのサイズは変更されていません。*dataは、バッファ・サイズの増加以外の理由でも変化する可能性があることに注意してください。終了時に*lenが0である場合は、デキューされたメッセージにはデータ部がなく、*dataも*dataが指すバッファも変更されていません。*dataまたはlenがNULLの場合はエラーになります。詳細は、tpalloc()を参照してください。 呼出し側がトランザクション・モードにあり、TPNOTRANフラグが設定されていない場合は、メッセージはトランザクション・モードでキューから取り出されます。この結果、tpdeqplus()が正常終了してコール元のトランザクションが正常にコミットされると、リクエストはキューから削除されます。呼出し側のトランザクションが、明示的に、またはトランザクション・タイムアウトあるいはなんらかの通信エラーの結果としてロールバックされると、メッセージはキュー上に残されます。つまり、キューからのメッセージの削除もロールバックされます。同じトランザクション内で、同じメッセージの登録と取出しを行うことはできません。 呼出し側がトランザクション・モードにないか、またはTPNOTRANフラグが設定されている場合は、メッセージはトランザクション・モードではキューから取り出されません。トランザクション・モードでない場合に通信エラーまたはタイムアウトが発生した場合、アプリケーションには、メッセージが正しくキューから取り出されたかどうかがわからず、メッセージが失われることがあります。

len

dataがNULLでない場合のdataの長さです。

ctrl

TPQCTL構造体

flags

tpdeqplus()の入力情報を制御するflagsパラメータの有効なビットの一覧を次に示します。
TPNOFLAGS
TPQGETBYMSGID
TPQGETBYCORRID
TPQWAIT
TPQPEEK
OTMQ
TPQGETBYFILTER
TPQGETMSGA
TPQREADJRN
TPQENDIAN
TPQGETBYSEQNUM
TPQGETBYMSGCLASS
TPQGETBYMSGTYPE

優先度

選択的なメッセージ受信のための優先度のレベルを指定します。優先度の範囲は、0(低優先度)-99(高優先度)です。

msg_class

送信されるメッセージのクラス・コードを指定します。OTMQでは、クラス引数の値にシンボリック名が使用できます。シンボリックなクラス名はMSG_CLAS_で始まります。クラス・シンボルの定義の詳細は、tmqsym.hインクルード・ファイルを参照してください。UNIXおよびNTシステムでは、tmqsym.hインクルード・ファイルは編集できません。アプリケーションで使用するタイプおよびクラスのシンボルを定義するインクルード・ファイルを作成する必要があります。
次に示すのは、OTMQで予約されているクラス・シンボルです。
予約済クラス                          シンボルの値
ACK_CLASS                       28
MSG_CLAS_PAMS                   29
TUXEDO_MSG                   31001
MSG_CLAS_TUXEDO_TPSUCCESS    31002
MSG_CLAS_TUXEDO_TPFAIL       31003
MSG_CLAS_XXX                 30000-32767
(31001-31003を除く)

msg_type

送信されるメッセージのタイプ・コードを指定します。OTMQでは、msg_type引数の値にシンボリック名が使用できます。シンボリックなタイプ名はMSG_TYPE_で始まります。タイプ・シンボルの定義の詳細は、tmqsym.hインクルード・ファイルを参照してください。
シンボルの値の範囲の-1から-5000はOTMQで予約されています。この引数の値がゼロの場合は、メッセージ・タイプによる処理は行われません。

block

次の形式を使用してメッセージの配信モードを指定します。
OTMQ_DEL_sn - このsnは、次に示す送信者通知の定数のうちの1つです。
WF - 完了の待機
AK - 非同期確認応答
NN - 非通知
注意: NNモードはトランザクションをサポートしないため、このモードでは自動的にTPNOTRANフラグが設定されます。

DIP

DIPは、次に示す配信インタレスト・ポイント定数のうちの1つです。
ACK - ターゲット・キューから読み取り、tpqconfirmmsg関数を使用して明示的に確認された。ACKは、受信側アプリケーションによる2番目のtpdeqplusの呼出しの後に送信される暗黙的な確認応答である場合もあります。
CONF - DQFから配信され、tpqconfirmmsg関数を使用して明示的に確認された(リカバリ可能)。
DEQ - ターゲット・キューから読み取られた。
DQF - 宛先のキュー・ファイルに格納された(リカバリ可能)。
MEM - Sターゲット・キューに格納された。
SAF - ストア・アンド・フォワード・ファイルに格納された(リカバリ可能)。
注意: 一時キューを使用していて、迅速な削除と再使用が行われる場合、まれな例として、以前の一時キューからの暗黙的なACKレスポンスが新規の一時キューに格納されることがあります。
OTMQ_DIP_ACKおよびOTMQ_DEL_WFを設定した場合、ACKメッセージはtpenqplusで読み取り、クライアントはACKメッセージを読み取るために別のAPIを呼び出す必要はありません。

timeout

アプリケーションに制御を戻す前にtpenqplus関数がメッセージが届くまで待機する時間の最大値を指定します。メッセージが届く前にタイムアウトが発生した場合、ステータス・コードOTMQ_TIMEOUTが戻されます。timeoutの値に0を指定すると、タイムアウトはデフォルト値の30秒に設定されます。

psb

最終的な完了ステータスを示すOTMQのステータス・ブロックの値を受け取ります。psb引数は、リカバリ可能メッセージの送受信時に使用されます。PSB構造体には、次のリスト1-4に示すようなメッセージ・リカバリ・システムからのステータス情報が格納され、メッセージの送受信の後にチェックできます。
リスト1-4 PSB構造体
struct psb_t {
	long type_of_psb;             /* PSB type */
	long del_psb_status;        /* The completion status of the function. It contains the status from TuxMsgQ. It can also contain a value of TPSUCCESS when the message is not sent recoverably. */
	long uma_psb_status;      /* The completion status of the undeliverable message action (UMA). The PSB UMA status indicates if the UMA was not executed or applicable. */
	long psb_reserved[6];    /* reserved filed */
};
typedef struct psb_t PSB;
注意: この構造体はすでにatmi.hで定義されています。

表1-8 PSB配信
PSB配信ステータス
プラットフォーム
説明
API
OTMQ__CONFIRMREQ
すべて
このメッセージの確認を要求。
Tpdeqplus()
OTMQ__DOWN
すべて
指定されたOTMQのキュー・サービス・グループが実行されていません。
すべて
OTMQ__POSSDUPL
すべて
メッセージは重複可能。
Tpdeqplus()
OTMQ__NO_DQF
すべて
DQFが無効なとき、DQFモードのメッセージ配信はPSBのdel_psb_statusがOTMQ__NO_DQFで戻されます。
Tpenqplus()
OTMQ__NO_SAF
すべて
SAF/DQFジャーナルが無効なとき、SAFモードのメッセージ配信はPSBのdel_psb_statusOTMQ__NO_SAFで戻されます。
Tpenqplus()
OTMQ__SUCCESS
すべて
正常完了を示します。
すべて

uma

指定した配信インタレスト・ポイントでメッセージが格納できなかった場合に実行されるアクションを指定します。この引数の形式はOTMQ_UMA_XXXで、このXXXは次に示すシンボルのうちの1つです。
シンボル          説明
DISC       メッセージの破棄
RTS        送信者に返却
SAF        ストア・アンド・フォワード
DLJ        使用不能のレター・ジャーナル
DLQ        配信不能キュー

replyqueue

受信側プログラムからのレスポンス・メッセージを受信するための代替キューに使用するq_nameを指定します。送信側プログラムでは、レスポンス・メッセージを受信するため、replyqueue引数に指定したキューにアタッチする必要があります。送信側プログラムで、そのqspace外のレスポンス・キューを割り当てることはできません。

correlation_id

相関識別子(32バイトの値として格納されるユーザー定義の識別子)を指定します。

filter_idx

tpqsetselect関数を使用して作成されるindex_handleとして設定されるfilter_idxのフィルタによりメッセージを取得します。

data

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

len

dataがNULLでない場合のdataの長さです。

Flags

次のものがあります。

TPNOTRAN

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

TPNOBLOCK

ブロッキング状態が存在する場合、メッセージはキューに登録されません。このフラグが設定されていて、メッセージの転送先である内部バッファがいっぱいであるなどのブロッキング条件が存在する場合には、呼出しは異常終了し、tperrnoTPEBLOCKが設定されます。このフラグが設定されていて、ターゲットのキューが別のアプリケーションによって排他的にオープンされているなどのブロッキング条件が存在する場合には、呼出しは異常終了し、tperrnoTPEDIAGNOSTICが設定され、TPQCTL構造体の診断フィールドはQMESHAREに設定されます。
TPNOBLOCKが設定されていない場合に、ブロッキング状態が存在すると、その状態が解消されるかタイムアウト(トランザクション・タイムアウトまたはブロッキング・タイムアウト)が発生するまで、呼出し側はブロックされます。タイムアウトが発生すると、呼出しは異常終了し、tperrnoTPETIMEに設定されます。

TPNOTIME

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

TPSIGRSTRT

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

戻り値

異常終了すると、tpdeqplus()は-1を返し、tperrnoを設定してエラーの状況を示します。そうでない場合は、tpdeqplus()から戻ったとき、キューは正常にデキューされています。

Errors:

異常終了すると、tpdeqplus()tperrnoを次のいずれかの値に設定します。(特記しないかぎり、エラーが呼出し側のトランザクションに影響を及ぼすことはありません。)

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPEOTYPE]

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

[TPETIME]

このエラー・コードは、いずれかのタイムアウトが発生したことを示します。

[TPEBLOCK]

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

[TPGOTSIG]

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

[TPEPROTO]

tpdeqplus()の呼出し方法が不適切です。キューまたはトランザクションには影響ありません。

[TPESYSTEM]

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

[TPEOS]

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

[TPEDIAGNOSTIC]

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

[QMEINVAL]

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

[QMEBADRMID]

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

[QMENOTOPEN]

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

[QMEBADMSGID]

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

[QMESYSTEM]

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

[QMEOS]

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

[QMEABORTED]

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

[QMEPROTO]

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

[QMEBADQUEUE]

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

[QMENOMSG]

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

[QMBADPRIORITY]

受信に使用された無効な優先度の値です。

[QMNOTDCL]

プロセスがOTMQにアタッチされていません。

 


tpqpublish()

名前

tpqpublish() - トピック・データのパブリッシュに使用します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqpublish (topic_name, data, len, flags)

説明

コール元は、tpqpublish()をトピック・データのパブリッシュに使用します。トピックは、topicおよびdataで指定され、dataはNULLでない場合にデータを指します。トピックおよびそのデータは、Oracle Tuxedo ATMIのEventBrokerによって、topicに対する評価が成功するサブスクリプションを持ち、dataに対する評価が成功するオプションのフィルタ・ルールを持つすべてのサブスクライバにディスパッチされます。

表1-9に、tpqpublish()がサポートする引数を示します。

表1-9 tpqpublish()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
topicname
char
参照
char *
渡される
data
char
参照
char *
渡される
len
long
参照
long
渡される
flags
long
参照
long
渡される

topicname

topicnameは、「TMQ:QNOT:QSPACE:usertopic」などのように、「TMQ:<QNOT>:qspaceの名前」で始まる最長32文字までのヌル終端文字列です。また、ドット(.)はOracle Tuxedoシステムによって定義されるイベントの頭文字として使用されるため、topicnameの最初の文字にはドットを使用できません。topicnameの「TMQ:QNOT:qspaceの名前」は、すべてのユーザー・トピックの接尾辞であり、単独ではユーザー・トピックの名前として使用できません。「QNOT」は必須ではありません。しかし、topicnameに「QNOT」が含まれているのは、パブリッシュされるメッセージがAVAIL/UNAVALIメッセージであることを意味しています。

data

dataには、NULL以外の場合は、tpalloc()によって以前に割り当てたバッファを指定し、lenには、バッファ内のイベントとともにポストするバッファに入っているデータの長さを指定する必要があります。長さを指定する必要のないタイプのバッファ(FMLフィールド化バッファなど)をdataが指す場合、lenは無視されます。dataがNULLの場合、lenは無視され、イベントはデータなしでポストされます。

Flags

パブリッシャがトランザクション内にあり、TPNOTRANがセットされていない場合は、パブリッシャされたトピックは、トランザクション・モードのEventBrokerに渡され、これは、EventBrokerがイベントをパブリッシャのトランザクションの一部として処理できるようにするためです。ブローカは、トランザクションによるイベント通知を、tpqsubscribe()に渡されるctl->flagsパラメータのTPEVTRANビットで設定されているサービス・ルーチンおよび安定ストレージ上のキューのサブスクリプションのみにディスパッチします。EventBrokerは、クライアントへの通知、およびtpqsubscribe()に渡されるctl->flagsパラメータでTPEVTRANビットの設定を使用しなかったサービス・ルーチンおよび安定ストレージ上のキューにあるサブスクリプションのディスパッチも行いますが、これはパブリッシャ・プロセスのトランザクションの一部としてではありません。
パブリッシャがトランザクションの外部にある場合、イベントに関連するサービスが異常終了すると、tpqpublish()は確認応答のない一方向のパブリッシュになります。このような状況は、イベント用にTPEVTRANが設定されている場合でも起こります(この設定には、tpqsubscribe()に渡されるctl.flagsパラメータを使用します)。パブリッシャがトランザクションの内部にある場合、関連するサービスがイベントに失敗すると、tpqpublish()TPESVCFAILを戻します。 次に、有効なフラグの一覧を示します。

TPNOTRAN

コール元がトランザクション・モードにあり、このフラグが設定されている場合は、イベントのパブリッシュはコール元のトランザクションのためには実行されません。トランザクション・モードにあるこのフラグを設定する呼出し側は、イベントのポストの際に、依然としてトランザクション・タイムアウトの対象となります。イベントのポストが正しく実行されなかった場合、呼出し側のトランザクションには影響はありません。

TPNOREPLY

tpqpublish()に、EventBrokerがトピックに対するすべてのサブスクリプションを処理するまで待機せずに戻るように通知します。TPNOREPLYがセットされると、tpqpublish()が成功して戻ったかどうかにかかわらず、tpurcode()はゼロに設定されます。呼出しプロセスがトランザクション・モードにあるとき、TPNOTRANが設定されないかぎりこの設定は使用できません。

TPNOBLOCK

ブロッキング状態が存在する場合、トピックはパブリッシュされません。このような条件が発生すると、呼出しは異常終了し、tperrnoにはTPEBLOCKが設定されます。TPNOBLOCKが指定されていないときにブロッキング条件が存在すると、呼出し側は、その条件が解消されるか、またはタイムアウト(トランザクションまたはブロッキング)が発生するまではブロックされます。

TPNOTIME

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

TPSIGRSTRT

ルーチン内部のシステム・コールがシグナルによって中断された場合、中断されたシステム・コールは再発行されます。TPSIGRSTRTが指定されていない場合にシグナルがシステム・コールを中断させると、tpqpublish()は異常終了し、tperrnoにはTPGOTSIGが設定されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT状態のスレッドはtpqpublish()の呼出しを発行できません。

戻り値

異常終了すると、tpqpublish()は-1を返し、tperrnoを設定してエラーの状況を示します。そうでない場合は、メッセージは、tpqpublish()の終了時に正常にブロードキャストされています。

Errors:

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

TMQEVTにアクセスできません。

[TPETIME]

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

[TPEBLOCK]

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

[TPGOTSIG]

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

[TPEPROTO]

tpqpublish()の呼出し方法が不適切です。

[TPESYSTEM]

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

[TPEOS]

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

 


tpqsubscribe()

名前

tpqsubscribe() - トピックのサブスクライブに使用します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
long tpqsubscirbe (topic, filter, ctl, flags)

説明

コール元は、tpqsubscribe()をトピックのサブスクライブに使用します。topicは、正規表現を含む、最長255文字のヌル終端文字列を指定します。filterを指定する場合は、ブール値のフィルタ・ルールを含む文字列を指定し、このルールは、TMQEVTがトピックをポストする前に正しく評価されます。パブリッシュされたトピックの受信では、TMQEVTにより、パブリッシュされたtopicの文字列に存在するフィルタ・ルールが適用されます。データがフィルタ・ルールのチェックにパスした場合は、TMQEVTは通知メソッドを呼び出し、そうでない場合は、ブローカは対応する通知メソッドを呼び出しません。呼出し側は、異なるフィルタ・ルールを利用して同じイベントを何度でもサブスクライブすることができます。

表1-10に、tpqsubscribe()がサポートする引数を示します。

表1-10 tpqsubscribe()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
topic
char
参照
char*
渡される
filter
char
参照
char*
渡される
ctrl
TPEVCTL
参照
TPEVCTL *
渡される
flags
long
参照
long
渡される

topic

topicは、「TMQ:<QNOT>:qspaceの名前」で始まる最長32文字までのヌル終端文字列です(たとえば、「TMQ:QNOT:QSPACE:usertopic」)。また、ドット(.)はOracle Tuxedoシステムによって定義されるイベントの頭文字として使用されるため、topicの最初の文字にはドットを使用できません。topicの「TMQ:QNOT:qspaceの名前」は、すべてのユーザー・トピックの接尾辞であり、単独ではユーザー・トピックの名前として使用できません。「QNOT」は必須ではありません。しかし、topicに「QNOT」が含まれている場合、パブリッシュされるメッセージがAVAIL/UNAVALIメッセージであることを示しています。

filter

filterはブール値のフィルタ・ルールを含む文字列で、このルールは、TMQEVTがトピックをポストする前に正しく評価されます。詳細は、「正規表現」を参照してください。

ctrl

TPEVCTL構造体はatmi.hにあります。
この構造体には次の要素が含まれています: /* Subscription Control structure */ struct tpevctl_t { long flags; char name1[XATMI_SERVICE_NAME_LENGTH]; char name2[XATMI_SERVICE_NAME_LENGTH]; TPQCTL qctl; }; typedef struct tpevctl_t TPEVCTL; 次に示すのは、トピックのサブスクリプションの制御オプションであるctl->flags要素の有効なビットの一覧です。

TPEVQUEUE

このフラグの設定は、サブスクライバが、トピックの通知をctl->name1およびctl->name2で名前を指定されたキュー・スペースにエンキューすることを示します。それは、パブリッシュされたトピック名がtopicに対して正常に評価され、TMQEVTにより、パブリッシュされたデータがトピックに関連するフィルタ・ルールに対してテストされたときです。データがフィルタ・ルールを通過した場合、またはトピックに対応したフィルタ・ルールが存在しない場合は、TMQEVTは、ctl->name1で名前を指定されたキュー・スペースおよびctl->name2で名前を指定されたキューに、トピックとともにパブリッシュされたデータとあわせて、メッセージをエンキューします。キュー・スペースとキューの名前は、Oracle Tuxedo ATMIシステムの有効な任意のキュー・スペースおよびキューの名前で、サブスクリプションの実行時に存在している場合と存在していない場合があります。
ctl->qctlには、パブリッシュされたトピックをエンキューするようにTMQEVTに指示するオプションも追加できます。オプションを何も指定しない場合は、ctl->qctl.flagsにはTPNOFLAGSを設定してください。そうでない場合は、tpenqplusのサブセクション「制御パラメータ」で説明されているオプションが設定できます。TPEVQUEUEは相互に排他的なフラグです。ctl->flagsにもTPEVTRANが設定されていて、tpqpublish()を呼び出しているプロセスがトランザクション・モードである場合、TMQEVTは、そのパブリッシャのトランザクションの一部となるようにパブリッシュされたトピックおよびそのデータをエンキューします。TMQEVTは、トランザクションをサポートするサーバー・グループに属している必要があります(詳細は「UBBCONFIG」を参照)。ctl->flagsTPEVTRANが設定されない場合は、TMQEVTは、そのパブリッシャのトランザクションの一部とならないようにパブリッシュされたトピックおよびそのデータをエンキューします。

TPEVTRAN

このフラグを設定することは、このサブスクリプションのトピック通知が存在する場合に、サブスクライバがこれをパブリッシャのトランザクションに含めることを希望していることを示します。パブリッシャがトランザクションではない場合は、このトピックを通知するためにトランザクションが開始されます。このフラグを設定しない場合は、このサブスクリプションに対してパブリッシュされたいかなるトピックも、パブリッシャが参加しているトランザクションのために実行させることはできません。
安定ストレージ内のキュー、キュー・スペース、およびキュー名へのサブスクリプションの場合は、一致を調べる際にtopicおよびfilterに加えて相関識別子が使用されます。相関識別子を利用することで、同じ送信先の、同じトピック表現やフィルタ・ルールに対する複数のサブスクリプションを区別できます。したがって、コール元がctl->flagsTPEVQUEUEを設定し、ctl->qctl.flagsTPQCOORIDが設定されなかった場合、topic、filter、ctl->name1に設定されたキュー・スペース名、およびctl->name2に設定されたキュー名が、TMQEVTにすでに知られている(相関識別子が指定された)サブスクリプションが持つそれらの値と一致するとtpqsubscribe()は異常終了します。さらに、ctl->qctl.flagsTPQCOORIDが設定されている場合は、topicfilterctl->name1ctl->name2およびctl->qctl.corridがTMQEVTにすでに知られている(同じ相関識別子が指定された)サブスクリプションのデータと一致すると、tpqsubscribe()は異常終了します。

TPEVPERSIST

デフォルトでは、OTMQは、通知先のリソースが使用不可能である場合はサブスクリプションを削除します(たとえば、サブスクリプションに関連するサービス・ルーチンまたはキュー・スペース/キュー名、あるいはその両方にOTMQがアクセスできない場合など)。このフラグを設定することは、そのようなエラーが発生してもサブスクリプションが持続するように(多くの場合、リソースは後で利用できるようになるため)サブスクライバが求めることを示します。このフラグを設定しない場合、このサブスクリプションで指定されたサービス名またはキュー・スペース/キュー名のいずれかへのアクセス時にエラーが発生すると、OTMQはこのサブスクリプションを削除します。
このフラグをTPEVTRANと同時に指定し、イベントの通知時にリソースが利用できない場合は、EventBrokerは、そのトランザクションを強制終了するようにポスト元に戻します。つまり、サブスクリプションが保持されている場合でも、リソースが使用できなければポスト元のトランザクションは異常終了します。

flags

次に、tpqsubscribe()に対して有効なflagsの一覧を示します。

OTMQ

注意: OTMQは、TPQCTL->flagsに設定する必要があります。

TPNOBLOCK

ブロッキング条件が存在する場合は、サブスクリプションは行われません。このような条件が発生すると、呼出しは異常終了し、tperrnoにはTPEBLOCKが設定されます。TPNOBLOCKが指定されていないときにブロッキング条件が存在すると、呼出し側は、その条件が解消されるか、またはタイムアウト(トランザクションまたはブロッキング)が発生するまではブロックされます。

TPNOTIME

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

TPSIGRSTRT

ルーチン内部のシステム・コールがシグナルによって中断された場合、中断されたシステム・コールは再発行されます。TPSIGRSTRTが指定されていない場合にシグナルがシステム・コールを中断させると、tpqsubscribe()は異常終了し、tperrnoにはTPGOTSIGが設定されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT状態のスレッドはtpqsubscribe()の呼出しを発行できません。

戻り値

異常終了すると、tpqsubscribe()は-1を返し、tperrnoを設定してエラーの状況を示します。そうでない場合は、トピックは、tpqsubscribe()の終了時に正常にサブスクライブされており、サブスクリプション・ハンドルが戻されます。

Errors:

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

TMQEVTにアクセスできません。

[TPETIME]

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

[TPEBLOCK]

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

[TPGOTSIG]

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

[TPEPROTO]

tpqsubscribe()の呼出し方法が不適切です。

[TPESYSTEM]

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

[TPEOS]

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

[TPELIMIT]

EventBrokerの最大サブスクリプション数に達したため、サブスクリプションが異常終了しました。

 


tpqunsubscribe()

名前

tpqunsubscribe() - サブスクリプションの削除に使用します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqunsubscirbe (subscription,flags)

説明

サブスクリプションの削除に使用します。

表1-11に、tpqunsubscribe()がサポートする引数を示します。

表1-11 tpqunsubscribe()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
subscription
long
参照
long
渡される
flags
long
参照
long
渡される

subscriptions

subscriptionは、tpqsubscribe()から戻されるサブスクリプション・ハンドルです。subscriptionをワイルドカード値の-1に設定すると、tpqunsubscribe()が、呼出し側のプロセスが以前に行ったすべての非永続型のサブスクリプションを削除する指示になります。非永続型のサブスクリプションとは、tpqsubscribe()ctl->flagsパラメータにTPEVPERSISTビットを設定して行われたサブスクリプションのことです。永続サブスクリプションは、tpqsubscribe()から返されたハンドルを使用することによってのみ削除できます。

flags

次に、tpqsubscribe()に対して有効なflagsの一覧を示します。

TPNOBLOCK

ブロッキング条件が存在する場合は、サブスクリプションは行われません。このような条件が発生すると、呼出しは異常終了し、tperrnoにはTPEBLOCKが設定されます。TPNOBLOCKが指定されていないときにブロッキング条件が存在すると、呼出し側は、その条件が解消されるか、またはタイムアウト(トランザクションまたはブロッキング)が発生するまではブロックされます。

TPNOTIME

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

TPSIGRSTRT

ルーチン内部のシステム・コールがシグナルによって中断された場合、中断されたシステム・コールは再発行されます。TPSIGRSTRTが指定されていない場合にシグナルがシステム・コールを中断させると、tpunsubscribe()は異常終了し、tperrnoにはTPGOTSIGが設定されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT状態のスレッドはtpqunsubscribe()の呼出しを発行できません。

戻り値

異常終了すると、tpqunsubscribe()tperrnoを次のいずれかの値に設定します。(特記しないかぎり、エラーが呼出し側のトランザクションに影響を及ぼすことはありません。)

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

OTMQのEventBrokerにアクセスできません。

[TPETIME]

このエラー・コードは、いずれかのタイムアウトが発生したことを示します。

[TPEBLOCK]

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

[TPGOTSIG]

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

[TPEPROTO]

tpqunsubscribe()の呼出し方法が不適切です。

[TPESYSTEM]

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

[TPEOS]

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

 


tpqconfirmmsg()

名前

tpqconfirmmsg() - 明示的な確認を必要とするメッセージの受信を確認します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqconfirmmsg (seq_number, force_j)

説明

明示的な確認を必要とするメッセージの受信を確認します。これは、明示的な確認用に構成されているキューに送信されたリカバリ可能メッセージか、または明示的な受信確認が必要なACK配信モードを使用して送信されたメッセージの場合です。アプリケーションでは、受信した各メッセージのPSBのステータス・フィールドを調べ、そのメッセージが明示的な確認を必要としているかどうかを判断する必要があります。

リカバリ可能メッセージを受信した場合、アプリケーションでは、メッセージ・リカバリ・ジャーナルのディスク記憶域からそのメッセージを削除するため、tpqconfirmmsg関数を呼び出す必要があります。リカバリ可能メッセージの受信が確認されない場合、そのメッセージはリカバリ・システムによって保持されたままになり、アプリケーションでそのキューからデタッチし、再びアタッチしたときに再配信されます。

OTMQでは、リカバリ・ジャーナル内の次に続くメッセージが配信されるときに、リカバリ可能メッセージの受信を自動的に確認できます。この機能は、暗黙的な確認と呼ばれます。

すべてのキューは、暗黙的な確認または明示的な確認のどちらかで構成されます。メッセージ・キューの構成方法の詳細は、『Oracle Tuxedo Message Queueコマンド・リファレンス・ガイド』のtmqadminに関する項を参照してください。

正常に配信されたリカバリ可能メッセージは、事後確認ジャーナル(PCJ)に記録できます。tpqconfirmmsg関数では、システムが現在、メッセージを格納するように構成されていない場合、force_j引数を使用してPCJファイルにメッセージを書き込みます。正常に配信されたリカバリ可能メッセージは、tpqconfirmmsg関数を使用して明示的に確認しないかぎり、PCJファイルには書き込むことができないことに注意してください。

tpqconfirmmsg()を使用するには、まずtpqattach()を呼び出す必要があります。

注意: tpqconfirmmsg()は非同期呼出しであり、その戻り時には、まだリカバリ・ジャーナル・ディスク記憶域内のリカバリ可能メッセージがリカバリ・システムによって削除されていないことがあります。

表1-12に、tpqconfirmmsg()がサポートする引数を示します。

表1-12 pqconfirmmsg()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
seq_number
long
参照
long *
渡される
force_j
int
参照
int
渡される

seq_number

確認するリカバリ可能メッセージのメッセージ順序番号を指定します。メッセージ順序番号は、各リカバリ可能メッセージ用にOTMQのメッセージ・リカバリ・システムによって生成されます。この値は、各リカバリ可能メッセージを読み取ったときに、tpdeqplus関数のPSBで受信側プログラムに渡されます。

force_j

このメッセージのジャーナル・アクションを指定します。この引数には次の事前定義済の定数があります。

記号
説明
OTMQ_DEFAULT_JRN
qspacecreateコマンドでジャーナルが有効になっている場合のみ、PCJキューへのメッセージの書き込みを有効にします。
OTMQ_FORCE_JRN
qspacecreateコマンドでジャーナルが有効になっている場合のみ、PCJキューへのメッセージの書き込みを有効にします。
OTMQ_NO_JRN
ジャーナルが構成されているかどうかにかかわらず、ジャーナルを無効にします。

戻り値

異常終了すると、tpqconfirmmsg()tperrnoを次のいずれかの値に設定します。(特記しないかぎり、エラーが呼出し側のトランザクションに影響を及ぼすことはありません。)

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPETIME]

このエラー・コードは、いずれかのタイムアウトが発生したことを示します。

[TPESYSTEM]

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

[TPEOS]

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

 


tpqsetselect()

名前

tpqsetselect() - アプリケーションの開発者が、メッセージを受け取るための複雑な選択基準を定義できます。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqsetselect (selection_array, num_masks, index_handle)

説明

アプリケーションの開発者が、メッセージを受け取るための複雑な選択基準を定義できます。選択配列により、キューに対して、メッセージ受信の優先度、範囲チェックのための2つの比較キー、およびメッセージがキューから選択される順序を決定する順序キーによる検索を指定します。

tpqsetselect関数は、メッセージ読取り用のOTMQ関数のsel_filter引数として使用されるインデックス・ハンドルを作成します。選択インデックス・ハンドルがtpdeqplusに渡されると、各受信メッセージが比較キーのkey_1およびkey_2と比較されます。メッセージが両方のキーと一致する場合(論理的なAND操作)、そのメッセージは一致メッセージのセットに追加されます。選択されたメッセージが配信される順序は、順序キーによって決定されます。

tpqsetselect()を使用するには、まずtpqattach()を呼び出す必要があります。

表1-13に、tpqsetselect()がサポートする引数を示します。

表1-13 tpqsetselect()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
selection_array
selection_array_component_tp
参照
selection_array_component_tp *
渡される
num_masks
short
参照
short *
渡される
index_handle
int
参照
int *
戻される

selection_array

各キューの選択ルールを格納した選択レコードの配列を指定します。この選択配列用に、C言語のデータ構造体がtypedefで型定義されています。この構造体は、tmqentry.hに次のように定義されています: typedef struct _selection_array_component_tp { char qspace[TMQSNAMELEN+1]; char queue[QNAMELEN+1];     TM32I priority; TM32I key_1_offset; TM32I key_1_size; TM32I key_1_value; TM32I key_1_oper; TM32I key_2_offset; TM32I key_2_size; TM32I key_2_value; TM32I key_2_oper; TM32I order_offset; TM32I order_size; TM32I order_order;     char key_value_qspace[TMQSNAMELEN+1];
    char key_value_queue[TMQNAMELEN+1]; union { otmq_correlation_id correlation_id; otmq_sequence_number sequence number } extended_key } selection_array_component_tp;
selection_array_component_tpデータ構造体には次のようなコンポーネントがあります。

表1-14 selection_array_component_tpデータ構造体のコンポーネント
コンポーネント
説明
QSpace、キューおよび優先度
アプリケーションで、キュー番号と優先度を指定できます。
比較キー1
メッセージの有効範囲のチェックに使用する、1番目の比較キーのコンポーネントを定義します。
比較キー2
メッセージの有効範囲のチェックに使用する、2番目の比較キーのコンポーネントを定義します。
順序キー
FIFO、最小値または最大値によるメッセージの選択を可能にするために必要な情報を格納します。
「OTMQ_SOURCE」のオフセットとしてのキーの値
「OTMQ_SOURCE」のオフセットとしてキーを設定する特殊なケースで、ソースとなるQSpace名およびキュー名を2つのフィールドに指定します。

表1-15に、Select_Queue構造体のこの部分の引数に適用できる有効な値を示します。

表1-15 キューおよび優先度
フィールド
説明
QSpace
QSpaceの名前
検索するQSpaceの名前を指定します。
Queue
キュー名
検索するキュー名を指定します。キュー名は、アプリケーションで読取りアクセスする任意のメッセージ・キューです。キュー名は、tpqattach関数のq_attached引数、またはtpqlocate関数のqnameから取得できます。この引数に文字の0を指定すると、アプリケーションのプライマリ・キューの指定になります。MRQ以外のキューでは、事前にキューにアタッチする必要があります(MRQでは、アタッチしていない場合、APIがまずMRQにアタッチします)。
Priority
 
両端の数を含めて0から99の整数値、または変数のいずれかで優先度を指定します。(直接的な整数値の使用は、優先度を指定する際によく使われる方法です。)アプリケーションでは、この引数に、次に示す事前定義済の定数を設定することもできます。優先度が0に設定されていると、優先度0のメッセージのみを読み取ります。
 
OTMQ_PRI_ANY
優先度0のメッセージの前に、優先度1のメッセージを読み取ります。
 
OTMQ_PRI_P0
優先度0のメッセージのみを読み取ります。
 
OTMQ_PRI_P1
優先度1のメッセージのみを読み取ります。

表1-16に、selection_array_component_tp構造体のこの部分に適用できる引数および有効な値を示します。

表1-16 比較キー
フィールド
説明
Offset
 
メッセージ内のどこから比較を開始するかを指定する値を格納します。次に示す事前定義済の定数が使用できます。
 
n
ユーザー・メッセージのバイト数(0からの相対)。
 
OTMQ_CLASS
メッセージのクラス。
 
OTMQ_TYPE
メッセージのタイプ。
 
OTMQ_SOURCE
メッセージのソース・キュー・アドレス。
 
OTMQ_CORRELATION_ID
メッセージの相関識別子。key_1_offsetまたはkey_2_offsetに使用できますが、両方には指定できません。このシンボルが指定された場合、SizeフィールドをOTMQ_CORRELATION_ID_SIZE(または、32バイト)に設定する必要があります。
 
OTMQ_SEQUENCE_NUMBER
OTMQのステータス・バッファから取得したメッセージの順序番号。このシンボルが指定された場合、SizeフィールドをOTMQ_SEQUENCE_NUMBER_SIZE(または、8バイト)に設定する必要があります。
Size
 
比較されるキーのデータ型を指定します。

注意: OTMQ_SOURCE」のオフセットの特殊なケースでは、サイズは次のいずれかの値になります(「0」を除く)。

 
0
キーの使用を無効化。
 
1
Byte (8ビット)。
 
2
Word (16ビット)。
 
4
int32 (32ビット)。
 
OTMQ_SEQUENCE_NUMBER_SIZE
8バイト。
 
OTMQ_CORRELATION_ID_SIZE
32バイト。
Value
n
32ビットの整数値の形式で、メッセージ・フィールドの比較フィールドの値を格納します。
oper
 
比較用の関係演算子。
 
OTMQ_OPER_EQ
メッセージ・フィールド = 値。
 
OTMQ_OPER_NEQ
メッセージ・フィールド <> 値。
 
OTMQ_OPER_GTR
メッセージ・フィールド > 値。
 
OTMQ_OPER_LT
メッセージ・フィールド < 値。
 
OTMQ_OPER_GTRE
メッセージ・フィールド > または = 値。
 
OTMQ_OPER_LTE
メッセージ・フィールド < または = 値。

Order Keyの部分には、次の表に示す変数を格納します。

表1-17 Order Key
フィールド
説明
Offset
 
メッセージ・フィールドのバイト・オフセット。このオフセット変数には、メッセージ内のどこから比較を開始するかを指定する値を格納します。
 
n
ユーザー・メッセージのバイト数(0からの相対)。(メモリー・キューのみサポート)
 
OTMQ_CLASS
メッセージのクラス。
 
OTMQ_TYPE
メッセージのタイプ。
 
OTMQ_CORRELATION_ID
メッセージの相関識別子。このシンボルが指定された場合、SizeフィールドをOTMQ_CORRELATION_ID_SIZE(または、32バイト)に設定する必要があります。
 
OTMQ_SEQUENCE_NUMBER
OTMQのステータス・バッファから取得したメッセージの順序番号。このシンボルが指定された場合、SizeフィールドをOTMQ_SEQUENCE_NUMBER_SIZE(または、8バイト)に設定する必要があります。
Size
 
比較するサイズ。サイズの変数は、比較されるキーのデータ型を指定します。
 
0
キーの使用を無効化。
 
1
Byte。
 
2
Word。
 
4
int32 (32ビット)。
 
OTMQ_SEQUENCE_NUMBER_SIZE
8バイト。
 
OTMQ_CORRELATION_ID_SIZE
32バイト。
Order
 
順序の演算子。この順序の変数は、選択処理が実行される順序を指定します。
 
OTMQ_ORDER_FIFO
1、優先度0のメッセージの前に、優先度1のメッセージの読取り
2、SQL SYNTAX: 優先度のDESC
3、保留中の最初
 
OTMQ_ORDER_MIN
1、すべての保留中の最小値
2、SQL SYNTAX: (オフセットはOTMQ_CLASS) クラスのASC、優先度のASC
3、最後に一致したメッセージの読取り
 
OTMQ_ORDER_MAX
1、すべての保留中の最大値
2、SQL SYNTAX: (オフセットはOTMQ_CLASS) クラスのDESC、優先度のASC
3、最後に一致したメッセージの読取り

相関識別子 相関識別子は、メッセージに関連付けられた32バイトのユーザー定義の識別子です。key_1_offsetまたはkey_2_offsetフィールドのいずれかの値としてOTMQ_CORRELATION_ID指定された場合、指定された相関識別子の値がメッセージとの一致のチェックに使用されます。相関識別子は各メッセージに1つであるため、OTMQ_CORRELATION_IDは比較キーの1つのみに指定でき、両方のキーに相関識別子を指定するとTPEINVALのエラーになります。 OTMQ_CORRELATION_IDがorder_offsetフィールドの値として指定されると、その相関識別子を持つメッセージは、order_orderフィールドで指定された順序で戻されます。 順序番号 メッセージの順序番号は各メッセージごとに一意の値です。順序番号はPSBに格納されています。アプリケーションでは、メッセージの順序番号をPSBから取得する必要があり、それに対するどのような変更も許されません。 注意: アプリケーションでは、相関識別子または順序番号による選択のため、2つのキーのうちの1つのみを指定できます。

num_masks

選択配列のレコード数を指定します。この引数では、選択配列の最小1レコードから最大256レコードまでが指定できます。

index_handle

次に示すように、選択マスクのためのインデックス・ハンドルが格納されている変数を受け取ります。
* 上位のワードにはOTMQ_BY_MASK、 * 下位のワードには選択配列へのインデックスが格納されています。 index_handleは、tpdeqplustpqgetmsgaおよびtpqcancelselect関数で、TPQCTLのsel_filter引数として渡されます。OTMQの実装では、32767までのインデックス・ハンドルが提供されます。

戻り値

異常終了すると、tpqsetselect()tperrnoを次のいずれかの値に設定します。

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPETIME]

このエラー・コードは、いずれかのタイムアウトが発生したことを示します。

[TPESYSTEM]

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

[TPEOS]

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

 


tpqcancelselect()

名前

tpqcancelselect() - 以前に生成された選択マスクに関連付けられている選択配列およびインデックス・ハンドルを解放します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqcancelselect (index_handle)

説明

以前に生成された選択マスクに関連付けられている選択配列およびインデックス・ハンドルを解放します。index_handleおよび関連付けられた選択マスクはtpqsetselect関数を使用して作成されます。選択マスクが非同期読取りリクエストで使用されるとき、この関数はまた、参照されたindex_handleを使用している保留中のtpqgetmsgaリクエストを取り消します。

tpqcancelselect()を使用するには、まずtpqattach()を呼び出す必要があります。

表1-18に、tpqcancelselect()がサポートする引数を示します。

表1-18 tpqcancelselect()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
index_handle
int
参照
int*
渡される

index_handle

tpqsetselectで戻されます。

戻り値

異常終了すると、tpqcancelselect()tperrnoを次のいずれかの値に設定します。

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPETIME]

このエラー・コードは、いずれかのタイムアウトが発生したことを示します。

[TPESYSTEM]

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

[TPEOS]

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

 


tpqreadjrn()

名前

tpqreadjrn() - OTMQのローカル・グループ・ジャーナルからメッセージを読み取ります。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqreadjrn (qspace, qname, ctl, type, odata, olen, timeout)

説明

OTMQのジャーナルからメッセージを読み取ります。tpqreadjrn()を使用するには、まずtpqattach()を呼び出す必要があります。

表1-19に、tpqreadjrnがサポートする引数を示します。

表1-19 tpqreadjrnの引数
引数
データ型
メカニズム
プロトタイプ
アクセス
qspace
char
参照
char *
渡される
qname
char
参照
char *
渡される
ctl
TPQCTL
参照
TPQCTL*
渡される/戻される
type
int
参照
int
渡される
odata
char
参照
char *
戻される
olen
long
参照
long *
戻される
timeout
long
参照
long
渡される

qspace

ジャーナル・メッセージを読み取るためのフィルタとしてキュー・スペースの名前を指定します。 SAF/DLQ/DLJジャーナル・キューでは、キュー・スペースは、クライアントが読み取ろうとするジャーナル・メッセージのソース・キュー・スペースです。PCJ/DQFジャーナルでは、キュー・スペースは、クライアントが読み取ろうとするジャーナル・メッセージのターゲット・キュー・スペースです。

qname

ジャーナル・メッセージを読み取るためのフィルタとして永続キューの名前を指定します。 SAF/DLQ/DLJジャーナル・キューでは、キュー名は、クライアントが読み取ろうとするジャーナル・メッセージのソース・キューです。PCJ/DQFジャーナルでは、キュー名は、クライアントが読み取ろうとするジャーナル・メッセージのターゲット・キュー名です。

制御パラメータ

flags

tpqreadjrn()では、ctl->flagsにOTMQ|TPQREADJRNを含める必要があります。

type

読み取るジャーナルのタイプを指定します。次の値が有効です。
SAF_HANDLEDQF_HANDLEDLQ_HANDLEDLJ_HANDLEおよびPCJ_HANDLE

odata

選択したメッセージ・リカバリ・ジャーナルから取得したメッセージのコンテンツを受け取ります。この引数には、OTMQがそこに書き込むメモリー・リージョンの名前またはメッセージ・ハンドルのいずれかが格納されています。

olen

メッセージのバッファ・サイズを指定します(バイト単位)。

timeout

アプリケーションに制御を戻す前にtpqreadjrn関数がメッセージが届くまで待機する時間の最大値を指定します。メッセージが届く前にタイムアウトが発生した場合、ステータス・コードOTMQ_TIMEOUTが戻されます。timeoutの値に0を指定すると、タイムアウトはデフォルト値の30秒に設定されます。

戻り値

異常終了すると、tpqreadjrn()tperrnoを次のいずれかの値に設定します。そうでない場合は、tpqreadjrn()から戻ったとき、メッセージは正常に読み取られています。tpqerrno()およびtpqstrerror()を使用し、詳細なOTMQのエラー番号や詳細な文字列のエラー・メッセージを取得できます。

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPEOTYPE]

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

[TPETIME]

このエラー・コードは、いずれかのタイムアウトが発生したことを示します。

[TPEBLOCK]

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

[TPGOTSIG]

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

[TPEPROTO]

tpdeqplus()の呼出し方法が不適切です。キューまたはトランザクションには影響ありません。

[TPESYSTEM]

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

[TPEOS]

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

[TPEDIAGNOSTIC]

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

診断

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

[QMEINVAL]

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

[QMEBADRMID]

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

[QMESYSTEM]

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

[QMEOS]

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

[QMEABORTED]

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

[QMEPROTO]

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

[QMEBADQUEUE]

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

[QMENOMSG]

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

[QMBADPRIORITY]

受信に使用された無効な優先度の値です。

[QMNOTDCL]

プロセスがOTMQにアタッチされていません。

 


tpqshowpending()

名前

tpqshowpending() - 選択されたキューのリストの保留中メッセージの数をリクエストします。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqshowpending ( qspace, count, in_q_list, out_pend_list)
need to follow the style of others API

説明

選択されたキューのリストの保留中メッセージの数をリクエストします。tpqshowpending関数を使用するには、保留中のメッセージ数を取得するメッセージ・キューの番号、および保留中のメッセージ数を取得したいキュー名のリストを指定します。この関数の戻り値は、各キューのメッセージの合計数です。

tpqshowpending()を使用するには、まずtpqattach()を呼び出す必要があります。

注意: out_pend_list配列を割り当てる必要があります。

リストされるキューの数は「count」によって決まるため、キューのリストの配列が適切に割り当てられるように注意してください。

表1-20に、tpqshowpendingがサポートする引数を示します。

表1-20 tpqshowpending()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
qspace
char
参照
char *
渡される
count
int
参照
int
渡される
in_q_list
char
参照
char **
渡される
out_pend_list
long
参照
long*
渡される/戻される

qspace

メッセージをエンキューするためのキュー・スペース名を指定します。最大長は15です。

count

in_q_list引数内のキューのエントリ数を指定します(配列内のインデックスの数)。指定できる最大値は32,000です。

in_q_list

保留中のメッセージ数をリクエストするキュー名を格納した配列を指定します。

out_pend_list

選択した各キューの保留中のメッセージ数を受け取ります。

戻り値

異常終了すると、tpqshowpending()はtperrnoを次のいずれかの値に設定します。tpqerrno()およびtpqstrerror()を使用し、詳細なOTMQのエラー番号や詳細な文字列のエラー・メッセージを取得できます。

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPETIME]

このエラー・コードは、いずれかのタイムアウトが発生したことを示します。

[TPESYSTEM]

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

[TPEOS]

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

 


tpqgetmsga()

名前

tpqgetmsga() - メッセージ受信の非同期通知をリクエストします。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqgetmsga (qspace, qname, ctl, data, len , uact, uact_param , uflag, flags)

説明

メッセージ受信の非同期通知をリクエストします。OTMQでは、tpqgetmsga関数はTuxedoの非請求型メッセージを使用して実装されています。tpqgetmsgaを呼び出すと、それ自身のUNSOLメッセージ・ハンドラを登録します。tpqgetmsgaの選択条件に一致するキューにメッセージが届くと、そのデキューされるメッセージは、UNSOLメッセージを介してアプリケーションに送信されます。また、UNSOLメッセージが届き、アプリケーションにそれ自身のメッセージ処理コールバック関数(またはフラグ)が設定されている場合、ユーザーのコールバック関数が呼び出され(またはフラグが「1」に設定され)、メッセージがtpqgetmsgaによってデキューされたことがアプリケーションに通知されます。

UNSOLメッセージがtpqgetmsgaのインフラストラクチャであるため、このAPIの呼出しに際し、UBB内のNOTIFYを「IGNORE」に設定してはいけません。また、一部の制限として、OpenVMSでは通知モードの「SIGNAL」はサポートされていません。

キューにリカバリ可能メッセージが送信されたとき、受信側プログラムでは、tpqconfirmmsg関数を使用してメッセージの受信を確認できます。tpqconfirmmsg関数により、正常に配信されたメッセージをメッセージ・リカバリ・システムから削除できます。

tpqgetmsga()を使用するには、まずtpqattach()を呼び出す必要があります。

表1-21に、tpqgetmsgaがサポートする引数を示します。

表1-21 tpqgetmsga()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
qspace
char
参照
char *
渡される
qname
char
参照
char *
渡される
ctl
TPQCTL
参照
TPQCTL *
渡される
data
char
参照
char **
渡される/戻される
len
long
参照
long *
渡される/戻される
uact
long
参照
long *
渡される
uact_param
long
参照
long *
渡される
uflag
long
参照
long *
渡される
flags
long
参照
long
渡される

qspace

メッセージをエンキューするためのキュー・スペース名を指定します。最大長は15です。

qname

メッセージをエンキューするためのキュー名を指定し、最大長は127です。

ctl

TPQCTL構造体

data

静的バッファ方式のメッセージングでは、OTMQが取得されるメッセージの内容をそこに書き込むメモリー・リージョンの名前を受け取ります。

len

静的メッセージ・バッファのバッファ・サイズを指定します(バイト単位)。

uact

ユーザー・アクション

uact_param

ユーザー・アクションのパラメータ

uflag

tpqgetmsga関数が完了したときに設定されるフラグ番号のint値を指定します。tpqgetmsga関数が実行されるとき、このフラグはクリアされます。この引数の値が指定されない場合、フラグは使用されません。

flags

tpdeqplusでサポートされるこのflagsは、TPNOTIMEで設定する必要があります。

戻り値

異常終了すると、tpqgetmsga()は-1を返し、tperrnoを設定してエラーの状況を示します。tpqerrno()およびtpqstrerror()を使用し、詳細なOTMQのエラー番号や詳細な文字列のエラー・メッセージを取得できます。

tpqgetmsga()tperrnoを次のいずれかの値に設定します。(特記しないかぎり、エラーがコール元のトランザクションに影響を及ぼすことはありません。)

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPETIME]

このエラー・コードは、いずれかのタイムアウトが発生したことを示します。

[TPESYSTEM]

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

[TPEOS]

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

[TPEDIAGNOSTIC]

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

[QMEINVAL]

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

[QMEBADRMID]

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

[QMENOTOPEN]

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

[QMEBADMSGID]

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

[QMESYSTEM]

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

[QMEOS]

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

[QMEABORTED]

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

[QMEPROTO]

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

[QMEBADQUEUE]

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

[QMENOMSG]

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

[QMBADPRIORITY]

受信に使用された無効な優先度の値です。

[QMNOTDCL]

プロセスがOTMQにアタッチされていません。

 


tpqcancelget()

名前

tpqcancelget() - sel_filter引数で指定された値に一致するすべての保留中tpqgetmsgaリクエストを取り消します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqcancelget (qspace, sel_filter , flags)

説明

sel_filter引数で指定された値に一致するすべての保留中tpqgetmsgaリクエストを取り消します。保留中のtpqgetmsgaリクエストが取り消されるとき、OTMQのステータス・ブロック(PSB)の配信ステータスがOTMQ__CANCELに設定され、指定したアクションのルーチンがキューイングされます。tpqcancelget関数は、tpqcancelget関数とtpqgetmsga関数のリクエストの間の適切な同期が取られるように、完了まで待機します。

未処理のtpqgetmsga関数のリクエストはすべて、tpqexit関数またはイメージの終了により取り消されます。

tpqcancelget()を使用するには、まずtpqattach()を呼び出す必要があります。

注意: tpqcancelgetでは、sel_filterパラメータに(0 | 0)を設定したpriority >= 0でsel_filter == NULLのtpqgetmsgaを取り消すことができます。
注意: 「sel_filter」が(OTMQ_PQ_PRI | x)と設定されているtpqcancelgetでは、「priority」がxで「sel_filter」がNULLに設定されているtpqgetmsgaは取り消すことができません。

表1-22に、tpqcancelgetがサポートする引数を示します。

表1-22 tpqcancelget()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
qspace
char
参照
char *
渡される
sel_filter
long
参照
long
渡される
flags
long
参照
long
渡される

qspace

メッセージ到着の非同期通知をリクエストしているキュー・スペースを指定します。

sel_filter

基準を指定し、この基準によりアプリケーションで未処理のtpqgetmsgaリクエストを選択的に取り消すことができます。sel_filter引数の詳細は、tpdeqplus関数の項を参照してください。複合的な選択フィルタの作成方法については、tpqsetselect関数の項を参照してください。

Flags

tpqcancelget()がトランザクション・モードにあり、TPNOTRANフラグが設定されていない場合、APIはトランザクション・モードに移行します。
次に、有効なフラグの一覧を示します。

TPNOTRAN

コール元がトランザクション・モードにあり、このフラグが設定されている場合は、イベントのパブリッシュはコール元のトランザクションのためには実行されません。トランザクション・モードにあるこのフラグを設定する呼出し側は、イベントのポストの際に、依然としてトランザクション・タイムアウトの対象となります。イベントのポストが正しく実行されなかった場合、呼出し側のトランザクションには影響はありません。

TPNOREPLY

tpqcancelget()に、EventBrokerがトピックに対するすべてのサブスクリプションを処理するまで待機せずに戻るように通知します。TPNOREPLYが設定されていると、tpqpublish()の成功/失敗にかかわらず戻ります。呼出しプロセスがトランザクション・モードにあるとき、TPNOTRANが設定されないかぎりこの設定は使用できません。

TPNOBLOCK

ブロッキング状態が存在する場合、トピックはパブリッシュされません。このような条件が発生すると、呼出しは異常終了し、tperrnoにはTPEBLOCKが設定されます。TPNOBLOCKが指定されていないときにブロッキング条件が存在すると、コール元は、その条件が解消されるか、またはタイムアウト(トランザクションまたはブロッキング)が発生するまではブロックされます。

TPNOTIME

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

戻り値

異常終了すると、tpqcancelget()は-1を返し、tperrnoを設定してエラーの状況を示します。tpqerrno()およびtpqstrerror()を使用して、詳細なOTMQのエラー番号および詳細な文字列のエラー・メッセージを取得できます。

tpqcancelget()はtperrnoを次のいずれかの値に設定します。

[TPEINVAL]

無効な引数が指定されました。

[TPENOENT]

qspaceが使用不可であるため、qspaceにアクセスできません。

[TPETIME]

このエラー・コードは、いずれかのタイムアウトが発生したことを示します。

[TPESYSTEM]

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

[TPEOS]

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

 


tpqerrno()

名前

tpqerrno() - OTMQシステム・コールのerrnoを取得します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
Int tpqerrno(void);

説明

tpqerrno()は、OTMQシステム・コールのエラー・コードを取得するために使用します。

戻り値

正常終了すると、tpqstrerror()はエラー・メッセージ・テキストを含む文字列を指すポインタを返します。

errが無効なエラー・コードの場合、tpqstrerror()は、NULLを返します。

 


tpqexit()

名前

tpqexit() - アプリケーションとOTMQキュー・サービス間のすべてのアタッチメントを終了します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
int tpqexit(void);

説明

アプリケーションとOTMQキュー・サービス間のすべてのアタッチメントを終了します。無制限キューおよび複数リソース・キュー以外のキューでは、キュー内のすべての保留中メッセージが破棄されます。永続的にアクティブなキュー内のメッセージを残しておくには、tpexitqを呼び出す前にTUXMSGQ_NOFLUSH_Qオプションを指定してtpdetachqを呼び出します。

戻り値

異常終了すると、tpqcancelget()は-1を返し、tperrnoを設定してエラーの状況を示します。

[TPEPROTO]

tpqexit()の呼出し方法が不適切です。

[TPESYSTEM]

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

[TPESVCERR]

tpqexitでサービス・ルーチンにエラーが発生しました。UBBCONFIGファイル内のSVCTIMEOUTまたはTM_MIB内のTA_SVCTIMEOUTが0でない場合にサービスのタイムアウトが発生すると、TPESVCERRが戻されます。

 


tpqstrerror()

名前

tpqstrerror() - Oracle Tuxedo Message Queueのエラー・メッセージ文字列の詳細を取得します。

シノプシス

#include <atmi.h>
#include <tmqentry.h>
#include <tmqreturn.h>
Void tpqstrerror(int tpqerrno);

説明

tpqstrerror()はTMQ_CATからエラー・メッセージのテキストを取得するために使用します。errは、OTMQシステムの関数呼出しが-1またはその他の異常終了値を返した場合にtperrnoに設定されるエラー・コードです。

tpqstrerror()によって戻されたポインタをuserlog()またはUNIX関数fprintf()に対する引数として使用できます。

表1-23に、tpqstrerror()がサポートする引数を示します。

表1-23 tpqstrerror()の引数
引数
データ型
メカニズム
プロトタイプ
アクセス
tpqerrno
int
参照
int
渡される

tpqerrno()

OTMQシステム・コールのerrnoを取得します。

戻り値

正常終了すると、tpqstrerror()はエラー・メッセージ・テキストを含む文字列を指すポインタを返します。

errが無効なエラー・コードの場合、tpqstrerror()は、char *を返します。


  先頭に戻る       前  次