MQCLOSE - オブジェクトのクローズ

MQCLOSE 呼び出しは、オブジェクトへのアクセスを解放するもので、MQOPEN 呼び出しの逆です。

構文

MQCLOSE (HCONN, HOBJ, OPTS, CMPCOD, REASON)

使用上の注意

  1. アプリケーションが MQDISC 呼び出しを発行するか、正常終了または異常終了すると、このアプリケーションによってオープンされたままになっているすべてのオブジェクトは、CONONE オプションで自動的にクローズされます。
  2. クローズされるオブジェクトがキュー であるときに、以下の点が適用されます。
    • キューに対する操作が作業単位の一部として実行される場合は、そのキューは、同期点の前後のいずれでも、同期点の結果に影響を与えることなくクローズすることができます。
    • OOBRW オプションを指定してオープンされたキューの場合、ブラウズ・カーソルは破壊されます。 その後で OOBRW オプションによってキューを再オープンした場合は、新しいブラウズ・カーソルが作成されます (MQOPEN で説明している OOBRW オプションを参照してください)。
    • MQCLOSE 呼び出しの時点でこのハンドルに対してメッセージが現在ロックされている場合、ロックは解除されます ( MQGMO-メッセージ取得オプション で説明されている GMLK オプションを参照してください)。
  3. クローズされるオブジェクトが動的キュー (永続または一時) であるとき、以下の点が適用されます。
    • 動的キューの場合、オプション CODEL または COPURG は、対応する MQOPEN 呼び出し上に指定されたオプションに関係なく指定することができます。
    • 動的キューが削除されると、キューに対して未解決になっている GMWT オプションを持つすべての MQGET 呼び出しは取り消され、理由コード RC2052 が戻ります。 MQGMO-メッセージ読み取りオプションで説明されている GMWT オプションを参照してください。

      動的キューが削除された場合、MQCLOSE 以外の呼び出しが前に入手した HOBJ ハンドルを使用してキューを参照しようとすると失敗し、理由コード RC2052 が戻ります。

      削除されたキューにアプリケーションからアクセスできなくても、キューを参照するすべてのハンドルがクローズして、キューに影響を与えるすべての作業単位がコミットされるか、またはバックアウトされるまでは、キューはシステムから除去されず、また関連リソースも解放されない点に注意してください。

    • 永続動的キューが削除されると、MQCLOSE 呼び出しで指定した HOBJ ハンドルが、キューを作成した MQOPEN 呼び出しによって戻されたハンドルではない 場合は、MQOPEN 呼び出しを妥当性検査するために使用されたユーザー ID が、キューを削除する許可を持っているかどうかが検査されます。 MQOPEN 呼び出し時に OOALTU オプションが指定された場合、検査されたユーザー ID は ODAU になります。
      この検査は以下のような場合は実行されません。
      • 指定されたハンドルが、キューを作成した MQOPEN 呼び出しによって戻されたハンドルである場合。
      • 削除されるキューが一時動的キューの場合。
    • 一時動的キューがクローズされるときに、MQCLOSE 呼び出しで指定された HOBJ ハンドルが、キューを作成した MQOPEN 呼び出しによって戻されたハンドルである場合、そのキューは削除されます。 これは MQCLOSE 呼び出し時にクローズ・オプションが指定されているか否かにかかわりなく起こります。 キューにメッセージがある場合、それらは廃棄されます。その際、レポート・メッセージは生成されません。

      キューに影響を与える、コミットされていない作業単位がある場合でも、キューとそのメッセージは削除されます。しかし、このことは作業単位が失敗する原因にはなりません。 ただし、前述のとおり、各作業単位がコミットされるか、またはバックアウトされるまでは、作業単位に関連するリソースは解放されません。

  4. クローズされるオブジェクトが配布リスト であるとき、以下の点が適用されます。
    • 配布リストに有効なクローズ・オプションは CONONE のみです。この呼び出しは、他のオプションが指定されている場合には失敗し、理由コード RC2046 または RC2045 が戻ります。
    • 配布リストがクローズされると、リスト内のキューについて個々の完了コードおよび理由コードは戻されません。診断目的に利用できるのは、この呼び出しの CMPCOD および REASON パラメーターのみです。

      いずれかのキューのクローズ時に障害が起こっても、キュー・マネージャーは処理を継続し、配布リスト内の残りのキューをクローズしようとします。 次に、この呼び出しの CMPCOD および REASON パラメーターが、その障害を記述する情報を戻すよう設定されます。 このため、キューのほとんどが正常にクローズされた場合でも、完了コードが CCFAIL になる場合があります。 クローズ中にエラーが発生したキューは、識別されません。

      複数のキュー内に障害がある場合、いずれの障害が CMPCOD および REASON パラメーターに報告されるかは定義されません。

  5. IBM® iでは、最初の MQOPEN 呼び出しが発行されたときにアプリケーションが暗黙的に接続されていた場合、最後の MQCLOSE が発行されたときに暗黙の MQDISC が発生します。
    互換モードで実行するアプリケーションのみ、暗黙に接続することができます。他のアプリケーションが明示的にキュー・マネージャーに接続するには、MQCONN 呼び出しか MQCONNX 呼び出しを発行しなければなりません。
    [IBMi]重要: まだ互換モードを使用している場合は、アプリケーションを再コンパイルし、代わりに静的バインド呼び出しを使用することを検討してください。 IBM iでの RPG アプリケーションの互換モード を参照してください。

パラメーター

MQCLOSE 呼び出しには、以下のパラメーターがあります。

HCONN (10 桁の符号付き整数) - 入力

接続ハンドル。

このハンドルは、キュー・マネージャーに対する接続を表します。 HCONNの値は、先行の MQCONN または MQCONNX 呼び出しによって戻されたものです。

互換モードで実行するアプリケーションの IBM i では、MQCONN 呼び出しを省略できます。また、 HCONN には以下の値を指定できます。
HCDEFH
デフォルトの接続ハンドル。
[IBMi]重要: まだ互換モードを使用している場合は、アプリケーションを再コンパイルし、代わりに静的バインド呼び出しを使用することを検討してください。 IBM iでの RPG アプリケーションの互換モード を参照してください。
HOBJ (10 桁の符号付き整数) - 入出力

オブジェクト・ハンドル

このハンドルは、クローズするオブジェクトを表します。 オブジェクトは、どのタイプでも構いません。 HOBJ の値は、前の MQOPEN 呼び出しで戻されたものです。

呼び出しが正常に完了すると、キュー・マネージャーは、環境に対して有効なハンドルでない値にこのパラメーターを設定します。 値は、以下のとおりです。
HOUNUH
使用できないオブジェクト・ハンドル。
OPTS (10 桁の符号付き整数) - 入力

MQCLOSE のアクションを制御するオプション。

OPTS パラメーターのオブジェクトのクローズ方法を制御します。 複数の方法でクローズできるのは、永続動的キューおよびサブスクリプションのみです。 永続動的キューは、保持することも削除することもできます。これらは、値 QDPERM を持つ DefinitionType 属性を持つキューです ( キューの属性 で説明されている DefinitionType 属性を参照してください)。 クローズ・オプションは、このトピックの後の表に要約されています。

永続サブスクリプションは保持することも除去することもできます。これらは、SODUR オプションを指定した MQSUB 呼び出しを使用して作成されます。

管理対象の宛先 (SOMAN オプションを使用した MQSUB 呼び出しで戻される Hobj パラメーター) へのハンドルを閉じる場合、関連したサブスクリプションも除去されたときには、キュー・マネージャーは取得されていないパブリケーションをすべてクリーンアップします。 これは、MQSUB 呼び出しで戻される Hsub パラメーターで CORMSB オプションを使用することによって行われます。 非永続サブスクリプションの場合、CORMSB は MQCLOSE でのデフォルトの振る舞いであることに注意してください。

非管理対象の宛先へのハンドルを閉じる場合、パブリケーションが送信されるキューのクリーンアップはユーザーの責任で行います。 まず CORMSB を使用してサブスクリプションを閉じてから、キューに何も残らなくなるまでメッセージを処理することをお勧めします。

以下のいずれかを 1 つのみ指定する必要があります。

動的キュー・クローズ・オプション
これらのオプションは、永続動的キューを閉じる方法を制御します。
CODEL
キューを削除します。
以下の条件のいずれかが真の場合、キューは削除されます。
  • 前の MQOPEN 呼び出しによって作成された永続動的キューであり、メッセージ、およびキューに対して未解決になっているコミットされていない読み取り要求また書き込み要求がない (現行タスクまたは任意のタスクのための)。
  • これは、 HOBJを戻した MQOPEN 呼び出しによって作成された一時動的キューです。 この場合、キューに入っているすべてのメッセージは消去されます。
その他の場合 (MQSUB 呼び出しで Hobj が返された場合を含む) はすべて、呼び出しは理由コード RC2045 で失敗し、オブジェクトは削除されません。
COPURG
キューを削除し、そこに入っているすべてのメッセージを除去します。
以下の条件のいずれかが真の場合、キューは削除されます。
  • 前の MQOPEN 呼び出しで作成された永続動的キューであり、キューに対して未解決になっているコミットされていない読み取り要求または書き込み要求がない (現行タスクまたはそれ以外の任意のタスクのための)。
  • これは、 HOBJを戻した MQOPEN 呼び出しによって作成された一時動的キューです。
その他の場合 (MQSUB 呼び出しで Hobj が返された場合を含む) はすべて、呼び出しは理由コード RC2045 で失敗し、オブジェクトは削除されません。
次の表は、どのクローズ・オプションが有効であるか、およびオブジェクトを残すか削除するかを示しています。
表 1. 保存または削除されたオブジェクトで使用するための有効なクローズ・オプション
オブジェクトまたはキューのタイプ CONONE CODEL COPURG
キュー以外のオブジェクト 保存 無効 無効
事前定義されたキュー 保存 無効 無効
永続動的キュー 保存 空で、保留中の更新がない場合は削除 メッセージを削除。保留中の更新がないキューを削除
一時動的キュー (キューの作成者から発行された呼び出し) 削除 削除 削除
一時動的キュー (キューの作成者から発行されていない呼び出し) 保存 無効 無効
配布リスト 保存 無効 無効
管理対象サブスクリプション宛先 保存 無効 無効
配布リスト (サブスクリプションは除去済み) メッセージを削除。キューを削除。 無効 無効
サブスクリプションのクローズ・オプション
これらのオプションは、ハンドルのクローズ時に永続サブスクリプションを除去するかどうか、およびアプリケーションによる読み取りを待機中のパブリケーションをクリーンアップするかどうかを制御します。 これらのオプションは、MQSUB 呼び出しの HSUB パラメーターで返されるオブジェクト・ハンドルで使用する場合にのみ有効です。
COKPSB
サブスクリプションに対するハンドルはクローズされますが、作成されたサブスクリプションは保持されます。 パブリケーションは引き続き、サブスクリプションで指定された宛先に送られます。 このオプションは、オプション SODUR を指定してサブスクリプションが行われた場合のみ有効です。 サブスクリプションが永続的である場合、COKPSB がデフォルトです。
CORMSB
サブスクリプションは除去され、サブスクリプションに対するハンドルはクローズされます。
MQSUB 呼び出しの Hobj パラメーターは Hsub パラメーターの閉止によって無効にされず、残りのパブリケーションを受け取るために引き続き MQGET または MQCB で使用することができます。 MQSUB 呼び出しの Hobj パラメーターもクローズされると、それが管理対象宛先だった場合、取り出されていないパブリケーションはすべて除去されます。
サブスクリプションが非永続的である場合、CORMSB がデフォルトです。
これらのサブスクリプションのクローズ・オプションは、以下の表に要約されます。
永続サブスクリプションのハンドルをクローズしてサブスクリプションをそのままにしておくには、以下のサブスクリプションのクローズ・オプションを使用します。
タスク サブスクリプション閉止オプション
MQOPENed ハンドルのパブリケーションを保持する COKPSB
MQOPENed ハンドルのパブリケーションを除去する アクションは許可されていない
SOMAN を使用するハンドルのパブリケーションを保持する COKPSB
SOMAN を使用するハンドルのパブリケーションを除去する アクションは許可されていない
永続サブスクリプション・ハンドルを閉じてアンサブスクライブするか、または非永続サブスクリプション・ハンドルを閉じることによってアンサブスクライブを行うには、以下のサブスクリプションのクローズ・オプションを使用します。
タスク サブスクリプション閉止オプション
MQOPENed ハンドルのパブリケーションを保持する CORMSB
MQOPENed ハンドルのパブリケーションを除去する アクションは許可されていない
SOMAN を使用するハンドルのパブリケーションを保持する CORMSB
SOMAN を使用するハンドルのパブリケーションを除去する COPGSB
先読みオプション

以下のオプションは、アプリケーションが要求する前にクライアントに送信されたものの、アプリケーションによってまだコンシュームされていない非永続メッセージに実行されることを制御します。 これらのメッセージは、クライアント先読みバッファーに格納されてアプリケーションによる要求を待機し、MQCLOSE が完了する前にキューから廃棄またはコンシュームすることができます。

COIMM
オブジェクトは即時にクローズされ、アプリケーションが要求する前にクライアントに送信されたメッセージはすべて廃棄されます。アプリケーションがこのメッセージをコンシュームすることはできません。 これがデフォルト値です。
COQSC
オブジェクトのクローズ要求は行われますが、アプリケーションが要求する前にクライアントに送信されたメッセージがあれば、引き続きクライアント先読みバッファーに存在し、MQCLOSE 呼び出しは警告コード RC2458 で戻りますが、オブジェクト・ハンドルは有効なままです。
アプリケーションは引き続きそのオブジェクト・ハンドルを使用することができ、メッセージがなくなるまで取り出しを続行します。その後、オブジェクトを再びクローズします。 アプリケーションの要求前にクライアントに送信されるメッセージがなくなると、先読みはオフになります。
COIMM が使用された場合に廃棄されるメッセージが最後の MQGET 呼び出しと続く MQCLOSE の間に着信する可能性があるので、アプリケーションでは、クライアント先読みバッファー内にメッセージがないという点に到達しようとするよりも、COQSC を使用することが推奨されています。
COQSC を使用して MQCLOSE が非同期コールバック関数内から発行される場合は、先読みメッセージの同じ動作が適用されます。 警告コード RC2458 が返される場合、コールバック関数は少なくとももう一度呼び出されます。 先読みされた最後に残ったメッセージがコールバック関数に渡されると、CBCFLG フィールドは CBCFBE に設定されます。
デフォルト・オプション

上記のいずれのオプションも必要ない場合、次のオプションを使用できます。

CONONE
オプションのクローズ処理は不要である。
これは、次のものに対して指定しなければなりません
  • キュー以外のオブジェクト
  • 事前定義キュー
  • 一時動的キュー (ただし、 HOBJ が、キューを作成した MQOPEN 呼び出しによって戻されたハンドルでは ない 場合のみ)。
  • 配布リスト
上記の場合はすべて、オブジェクトは残され、削除されません。
このオプションが一時動的キューに対して指定されていると、次のようになります。
  • HOBJ を戻した MQOPEN 呼び出しによってキューが作成された場合、そのキューは削除されます。 キューにあるすべてのメッセージがパージされます。
  • 上記以外の場合、キュー (およびキュー内のすべてのメッセージ) は保存されます。

永続動的キューに対してこのオプションが指定されていると、キューは残され、削除されません。

CMPCOD (10 桁の符号付き整数) - 出力

完了コード。

これは、以下のいずれかになります。
CCOK
正常終了。
CCWARN
警告 (部分完了)。
CCFAIL
呼び出し失敗。
REASON (10 桁の符号付き整数) - 出力

CMPCODを限定する理由コード。

CMPCOD が CCOK の場合
RCNONE
(0, X'000') レポートする理由コードはありません。
CMPCOD が CCWARN の場合
RC2241
(2241, X'8C1') メッセージ・グループが不完全である。
RC2242
(2242, X'8C2') 論理メッセージが不完全である。
CMPCOD が CCFAIL の場合
RC2219
(2219, X'8AB') 前の呼び出しが完了する前に MQI 呼び出しが再入力されました。
RC2009
(2009, X'7D9') キュー・マネージャーとの接続が失われました。
RC2018
(2018, X'7E2') 接続ハンドルが無効です。
RC2019
(2019, X'7E3') オブジェクト・ハンドルが無効です。
RC2035
(2035, X'7F3') アクセスは許可されません。
RC2101
(2101, X'835') オブジェクトが損傷しました。
RC2045
(2045, X'7FD') オプションが、オブジェクト・タイプとして無効です。
RC2046
(2046, X'7FE') オプションが無効であるか、矛盾しています。
RC2058
(2058, X'80A') キュー・マネージャー名が無効であるか、認識されていません。
RC2059
(2059, X'80B') キュー・マネージャーを接続に使用できません。
RC2162
(2162, X'872') キュー・マネージャーのシャットダウン中です。
RC2055
(2055, X'807') メッセージ、またはコミットされていない 書き込み要求か取得要求が、1 つ以上キューに入っています。
RC2102
(2102, X'836') 使用できるシステム・リソースが不足しています。
RC2063
(2063, X'80F') セキュリティー・エラーが発生しました。
RC2071
(2071, X'817') ストレージが不足しています。
RC2195
(2195, X'893') 予期しないエラーが発生しました。

RPG 宣言

     C*..1....:....2....:....3....:....4....:....5....:....6....:....7..
     C                     CALLP     MQCLOSE(HCONN : HOBJ : OPTS :
     C                                       CMPCOD : REASON)
呼び出しのプロトタイプ定義は次のようになります。
     D*..1....:....2....:....3....:....4....:....5....:....6....:....7..
     DMQCLOSE          PR                  EXTPROC('MQCLOSE')
     D* Connection handle
     D HCONN                         10I 0 VALUE
     D* Object handle
     D HOBJ                          10I 0
     D* Options that control the action of MQCLOSE
     D OPTS                          10I 0 VALUE
     D* Completion code
     D CMPCOD                        10I 0
     D* Reason code qualifying CMPCOD
     D REASON                        10I 0