XX.... XX # YY....YY ERR
4 MQC MQI クライアント機能の
この章では,C 言語または COBOL 言語の MQI を使用したク ライアントアプリケーションの作成方法について説明します。
使用できるMQI
MQBACK命令 − ローカルトランザクションのロールバック MQBEGIN命令 − ローカルトランザクションの開始 MQCMIT命令 − ローカルトランザクションのコミット MQBO構造体 − ローカルトランザクション開始オプション MQIのサンプルアプリケーション
MQIのサンプルコーディング(C言語)
MQIのサンプルコーディング(COBOL言語)
使用できる MQI
MQCクライアント機能はOpenTP1システム以外のTMと接続または非接続で動作しま す。
MQCクライアント機能のクライアントアプリケーションは,TP1/Message Queueの MQIを使用できます。MQIはトランザクションの範囲およびトランザクションの範囲外 で使用できます。ただし,使用するTMがX/OpenのXAインタフェースに準拠してい る必要があります。
MQCクライアント機能のクライアントアプリケーションが使用できるMQIを次の表に 示します。
TMと接続しない場合にだけ,項番10から12のローカルトランザクション機能が使用 できます。
表4-1 MQCクライアント機能のクライアントアプリケーションが使用できるMQI一覧
注※
コネクションハンドルの有効範囲は,環境のパラレル処理の最小単位までです。
MQCONN命令を呼び出したパラレル処理の単位外ではこのハンドルは無効です。
TP1/Message Queue - Accessのパラレル処理の最小単位はスレッドです。
MQIの詳細については,項番1から9は,マニュアル「TP1/Message Queue プログラ ム作成リファレンス」を参照してください。項番10から12は以降のページで説明しま す。
MQCクライアント機能のクライアントアプリケーションのコンパイルおよびリンケージ
項番 関数名 機能
1 MQCLOSE オブジェクトのクローズ
2 MQCONN※ キューマネジャへの接続
3 MQDISC キューマネジャからの切り離し
4 MQGET メッセージの取り出し
5 MQINQ オブジェクトの属性の照会
6 MQOPEN オブジェクトのオープン
7 MQPUT メッセージの登録
8 MQPUT1 1メッセージの登録
9 MQSET オブジェクトの属性の設定
10 MQBACK ローカルトランザクションのロールバック
11 MQBEGIN ローカルトランザクションの開始
12 MQCMIT ローカルトランザクションのコミット
時に使用するライブラリファイルについては,「2.1 MQCクライアント機能のセット アップ」を参照してください。
MQBACK 命令 − ローカルトランザクショ ンのロールバック
機能
MQBACK命令では,最後の同期点以降に発生したメッセージの読み取りと書き込みを
すべてロールバックすることをキューマネジャに指示します。トランザクションの一部 として書き込まれたメッセージは削除されます。トランザクションの一部として取り出 されたメッセージはキューに戻されます。
形式
C言語の場合
MQBACK (MQHCONN Hconn, MQLONG *CompCode, MQLONG *Reason)
COBOL言語の場合
CALL 'MQBACK' USING HCONN, COMPCODE, REASON.
引数
● Hconn(MQHCONN型) − input コネクションハンドルです。
キューマネジャへの接続を示すハンドルです。MQCONN命令の戻り値を指定してくだ さい。
● CompCode(MQLONG型) − output
完了コードです。次のどれかが返されます。
MQCC_OK:成功
MQCC_WARNING:警告(一部成功)
MQCC_FAILED:失敗
● Reason(MQLONG型) − output
理由コードです。
表4-2 CompCode引数がMQCC_OKの場合(MQBACK命令の場合)
理由コード 意味
MQRC_NONE 理由コードはありません。
表4-3 CompCode引数がMQCC_WARNINGの場合(MQBACK命令の場合)
表4-4 CompCode引数がMQCC_FAILEDの場合(MQBACK命令の場合)
「理由コード」の詳細については,マニュアル「TP1/Message Queue プログラム作成リ ファレンス」を参照してください。
注意事項
● この命令は,適切なTMが存在しない環境でだけ使用できます。
このような環境では,キューマネジャ自体がトランザクションを管理します(ローカ ルトランザクション)。
• ローカルトランザクションおよびグローバルトランザクションの詳細については,
「MQBEGIN命令」を参照してください。
• 適切なTMが存在する環境で,トランザクションをロールバックする場合は,
MQBACK命令ではなく適切なロールバック命令を使用するか,アプリケーション
を異常終了させてトランザクションをロールバックする必要があります。
●1トランザクションには,一つのコネクションハンドルと同じ有効範囲があります。
つまり,特定のトランザクションに影響を与えるMQI命令は,同じコネクションハ ンドルを使用して実行しなければなりません。例えば,別のアプリケーションで命令 を呼び出すなど,別のコネクションハンドルを用いて命令を呼び出すと,別のトラン ザクションに影響が及びます。
コネクションハンドルの有効範囲については,マニュアル「TP1/Message Queue プロ グラム作成リファレンス」のMQCONN命令を参照してください。
理由コード 意味
MQRC_OUTCOME_PENDING コミットまたはロールバック操作の結果が保留状
態です。
理由コード 意味
MQRC_CALL_IN_PROGRESS 前の呼び出しが完了する前に,再度MQI呼び出
しが実行されました。
MQRC_CONNECTION_BROKEN キューマネジャとの接続が失われました。
MQRC_ENVIRONMENT_ERROR 呼び出しが環境内で有効ではありません。
MQRC_HCONN_ERROR コネクションハンドルが無効です。
MQRC_OBJECT_DAMAGED オブジェクトが破損しています。
MQRC_OUTCOME_MIXED コミットまたはロールバック操作の結果が混合し
ています。
MQRC_Q_MGR_STOPPING キューマネジャが終了処理中です。
MQRC_RESOURCE_PROBLEM システム資源が不足しています。
MQRC_STORAGE_NOT_AVAILABLE 記憶容量が不足しています。
MQRC_UNEXPECTED_ERROR 予期しないエラーが発生しました。
● この命令で影響を受けるメッセージは,現在のトランザクションの一部として書き込 まれたメッセージ,または取り出されたメッセージに限られます。
● 長時間実行しているアプリケーションで,1トランザクションに対してMQGET命 令,MQPUT命令,またはMQPUT1命令を呼び出している場合,コミット命令また はロールバック命令を一度も呼び出さないと,ほかのアプリケーションでは使用でき ないメッセージで,キューがいっぱいになることがあります。
● トランザクションが発生していない状態でMQBACK命令を発行した場合は MQRC_HCONN_ERRORのエラーになります。
MQBEGIN 命令 − ローカルトランザクショ ンの開始
機能
MQBEGIN命令で,キューマネジャによって管理されるトランザクションを開始しま
す。
形式
C言語の場合
MQBEGIN (MQHCONN Hconn, MQBO *BeginOptions, MQLONG *CompCode, MQLONG *CompReason)
COBOL言語の場合
CALL 'MQBEGIN' USING HCONN, BEGINOPTIONS, COMPCODE, REASON.
引数
● Hconn(MQHCONN型) − input コネクションハンドルです。
キューマネジャへの接続を示すハンドルです。MQCONN命令の戻り値を指定してくだ さい。
● BeginOptions(MQBO構造体) − input
MQBEGIN命令の動作を制御するオプションです。
詳細については,「MQBO構造体」を参照してください。
BeginOptionsは,予約済みパラメタです。C言語で作成されたプログラムでは,MQBO 構造体のアドレスを指定しないで,NULLアドレスを指定できます。
● CompCode(MQLONG型) − output
完了コードです。次のどちらかが返されます。
MQCC_OK:成功 MQCC_FAILED:失敗
● Reason(MQLONG型) − output 理由コードです。
表4-5 CompCode引数がMQCC_OKの場合(MQBEGIN命令の場合)
表4-6 CompCode引数がMQCC_FAILEDの場合(MQBEGIN命令の場合)
「理由コード」の詳細については,マニュアル「TP1/Message Queue プログラム作成リ ファレンス」を参照してください。
注意事項
●MQBEGIN命令は,キューマネジャで管理されるトランザクションの開始に使用しま
す。
キューマネジャは,次の二つのタイプのトランザクションをサポートします。
1. キューマネジャで管理されるローカルトランザクション
参加プログラムがキューマネジャだけのトランザクションであり,キューマネジャが TMとして機能します。
• ローカルトランザクションを開始するには,トランザクション内の最初の MQPUT,MQPUT1,またはMQGET命令にMQPMO_SYNCPOINTまたは MQGMO_SYNCPOINTオプションを指定してください。ローカルトランザクショ ンを開始するのに,アプリケーションがMQBEGIN命令を呼び出す必要はありま せん。
• ローカルトランザクションをコミットまたはロールバックするには,MQCMITま
たはMQBACK命令を使用する必要があります。アプリケーションでどちらの命令
も呼び出さない場合,このトランザクションは,MQDISC命令を呼び出すとコ
理由コード 意味
MQRC_NONE 理由コードはありません。
理由コード 意味
MQRC_BO_ERROR 開始オプション構造体が無効です。
MQRC_CALL_IN_PROGRESS 前の呼び出しが完了する前に,再度MQI呼び出
しが実行されました。
MQRC_CONNECTION_BROKEN キューマネジャとの接続が失われました。
MQRC_ENVIRONMENT_ERROR 呼び出しが環境内で有効ではありません。
MQRC_HCONN_ERROR コネクションハンドルが無効です。
MQRC_OPTIONS_ERROR オプションが有効でないか,整合性がありませ
ん。
MQRC_Q_MGR_STOPPING キューマネジャが終了処理中です。
MQRC_RESOURCE_PROBLEM システム資源が不足しています。
MQRC_STORAGE_NOT_AVAILABLE 記憶容量が不足しています。
MQRC_UNEXPECTED_ERROR 予期しないエラーが発生しました。
MQRC_UOW_IN_PROGRESS トランザクションが開始済みです。
ミットされますが,MQDISC命令を呼び出さないで終了するとロールバックされ ます。
2. 外部管理されるグローバルトランザクション
キューマネジャが参加プログラムであるが,TMとしては機能しないトランザクショ ンです。その代わりに,キューマネジャが接続しているTMが存在します。
• グローバルトランザクションを開始するには,TMが提供する関連命令を使用する 必要があります。トランザクションを開始するためにMQBEGIN命令を使用する と失敗し,理由コードMQRC_ENVIRONMENT_ERRORが戻ります。
• グローバルトランザクションをコミットまたはロールバックするには,TMが提供 するコミット命令およびロールバック命令を使用しなければなりません。
MQCMITおよびMQBACK命令は使用できません。
● アプリケーションが一度に参加プログラムとしてかかわれるトランザクションは,一 つだけです。アプリケーションでMQBEGIN命令を呼び出す場合,そのアプリケー ション用のトランザクションがすでに存在していると,その命令は失敗し,理由コー ドMQRC_UOW_IN_PROGRESSが戻ります。