Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 TP1/Server Base Enterprise Option プログラム作成の手引


ee_dbq_msgget

〈このページの構成〉

名称

メッセージの読み出し

形式

ANSI C,C++の形式

#include <eedbq.h>
int ee_dbq_msgget (char *dbque_name, EEULONG buf_len, void *buf_pt,
                   EEULONG *out_len, EEULONG *seq_num, EELONG flags)

機能

メッセージを読み出します。

メッセージをDBキューから読み出すためのSQLの実行は,この関数内で行います。このときのSQLは,SQL実行中だけ排他を取ります。

メッセージを読み出し済みに更新するためのSQLの実行は,トランザクションの同期点処理内で行います。1トランザクションで複数のDBキューに対してこの関数を実行した場合は,API関数の実行順序に関係なく,DBキュー名の昇順にSQLを実行します。そのため,複数のDBキューに対してこの関数を実行するトランザクション間でこの関数の実行順序が異なっても,実行順序が原因でデッドロックすることはありません。

同一グローバルトランザクションのトランザクションブランチ間でこのAPI関数を実行すると,デッドロックが発生する場合があります。詳細は「注意事項」を参照してください。

UAPで値を設定する引数

●dbque_name

読み出し対象のDBキュー名を設定します。27バイト以内のアスキー文字列で設定します。文字列の最後にはNULL文字を設定してください。このNULL文字は文字列の長さに数えません。

●buf_len

読み出したメッセージを格納する領域の長さを設定します。65以上の値を指定してください。

●buf_pt

読み出したメッセージを格納する領域のアドレスを設定します。読み出したいメッセージの長さ+64バイトの領域を用意してください。先頭から64バイトはTP1/EEで使用します。

buf_ptには,8バイトで境界調整した領域のアドレスを指定してください。

●out_len

読み出したメッセージの長さを格納する領域のアドレスを設定します。

●seq_num

読み出したメッセージの通番を格納する領域のアドレスを設定します。

●flags

EENOFLAGSを設定します。

TP1/EEから値が返される引数

●buf_pt

読み出したメッセージが返されます。読み出したメッセージの先頭はbuf_pt+64バイトのアドレスです。

●out_len

読み出したメッセージの長さが返されます(単位:バイト)。

[図データ]

読み出したメッセージがオーバフローしてしまう場合(リターン値EEDBQER_BUF_OVERFLOW)でも,buf_lenで指定した長さにかかわらず,読み出したメッセージの長さが返されます。この場合,オーバフローしたメッセージは読み出し成功として動作します。

[図データ]

●seq_num

読み出したメッセージの通番が返されます。

リターン値

リターン値

意味

EE_OK

正常に終了しました。

EECOMER_CNDBPP

オフラインバッチプロセスから発行しているため,この機能は使用できません。

EECOMER_CNDUOC

UOCから発行しているため,この機能は使用できません。

EECOMER_ENVIRON

TP1/EEの環境下にありません。

EEDBQER_ARGUMENT

引数に設定した値が間違っています。

EEDBQER_BUF_LEN

バッファ長が指定範囲外です。

EEDBQER_BUF_OVERFLOW

読み出したメッセージがバッファをオーバフローしました。読み出し成功として動作します。

EEDBQER_CONDITION

関数の呼び出し条件が不正です。

  • トランザクション種別が不正です。

EEDBQER_MEMORY_SHORT

メモリが不足しました。

EEDBQER_NO_DBQUE

要求されたDBキューは存在しません。

EEDBQER_NO_LIBRARY

DBキュー機能のライブラリがリンケージされていません。

EEDBQER_NO_MESSAGE

未読み出しのメッセージはありません。

EEDBQER_NO_OPTION

DBキュー機能は使用できません。

EEDBQER_NOT_USERQUE

ユーザキューアクセス機能を使用するDBキューではありません。

EEDBQER_QUE_TYPE

設定されたDBキューのタイプは機能対象外です。

  • 相手読み出しDBキュー

EEDBQER_QUE_TYPE_ROLLBACK

同じトランザクションブランチ内でこの関数が正常に終了したあと,再度呼び出されましたが,設定されたDBキューのタイプの属性が変更されたため,ee_trn_rollback_mark関数を呼び出しました。

EEDBQER_READ_STOP

読み出し停止中です。

EEDBQER_READ_TIMING

他サービスでリード処理中です。

EEDBQER_RM_ACCESS

リソースマネジャアクセス時にエラーが発生しました。

EEDBQER_RM_ACCESS_ROLLBACK

同じトランザクションブランチ内でこの関数が正常に終了したあと,再度呼び出されましたが,RMで障害が発生したため,ee_trn_rollback_mark関数を呼び出しました。

EEDBQER_RM_CONNECT

該当するスレッドではリソースマネジャに接続されていません。

EEDBQER_ROLLBACK_RESERVE

HiRDBの暗黙的ロールバックが発生したため,ee_trn_rollback_mark関数を呼び出しました。

EEDBQER_STOP

DBキューが使用できない状態です。

EEDBQER_TIMING

このAPI関数を呼び出せる状態ではありません。

  • 通番の初期化中です。

  • スキップ処理中です。

EEDBQER_TIMING_ROLLBACK

同じトランザクションブランチ内でこの関数が正常に終了したあと,再度呼び出されましたが,呼び出せる状態ではないため,ee_trn_rollback_mark関数を呼び出しました。

  • 通番の初期化中です。

EEDBQER_UNRESOLVABLE

その他のエラーが発生しました。

注意事項

  1. DBキューサービス(ルートトランザクションブランチ)から呼び出された同一グローバルトランザクションのトランザクションブランチで,同一DBキューに対してメッセージの読み出しを行うと,デッドロックが発生する場合があります。

  2. 同一グローバルトランザクション内のトランザクションブランチ間で,同一DBキューに対してメッセージを書き込んだり読み出したりスキップしたりすると,デッドロックが発生する場合があります。

  3. 同一トランザクションで同一のDBキューに対して複数回ee_dbq_msgget関数を実行すると,一回目以外の呼び出しでは,前回読み出したメッセージの次の通番のメッセージを読み出します。同じ通番のメッセージの再読み出しはしません。

  4. 【TP1/FSP限定】交替用メッセージ表書き込み機能使用時に,この関数内で行うメッセージ表へのアクセスで障害が発生すると,この関数はリターンしないでトランザクションがリトライロールバックする場合があります。