4.3.7 動的キュー
アプリケーションがモデルキューをオープンするMQOPEN命令を発行するとき,キューマネジャはモデルキューと同じ属性でローカルキューのインスタンスを動的に作成します。モデルキューのDefinitionType属性の値に応じて,キューマネジャは一時的動的キューまたは永続的動的キューを作成します。
(1) 一時的動的キューの特徴
一時的動的キューには,次に示す特徴があります。
-
一時的動的キューは非永続メッセージだけを保持します。
-
一時的動的キューは回復できません。
-
キューマネジャ開始時に一時的動的キューは削除されます。
-
MQOPEN命令を発行してキューを作成したアプリケーションが,キューをクローズしたり終了したりした場合には,一時的動的キューは削除されます。
-
キューにコミットされたメッセージがある場合,メッセージは削除されます。
-
キューについてコミットされない未解決のMQGET命令,MQPUT命令,またはMQPUT1命令がある場合,キューは論理的に削除されます。その後クローズ処理またはアプリケーションの終了時に,命令がコミットされると物理的に削除されます。
-
キューが使用中(作成中,または他アプリケーションが使用中)の場合,キューは論理的に削除されます。その後,最後にキューを使用するアプリケーションによってクローズされるときに物理的に削除されます。
-
論理的に削除されたキューにアクセス(クローズを除く)すると,理由コードMQRC_Q_DELETEDで失敗します。
-
キューを作成したMQOPEN命令に対応するMQCLOSE命令で指定された場合は,MQCO_NONE,MQCO_DELETE,およびMQCO_DELETE_PURGEはすべてMQCO_NONEとして扱われます。
-
(2) 永続的動的キューの特徴
永続的動的キューには,次に示す特徴があります。
-
永続的動的キューは永続メッセージまたは非永続メッセージを保持します。
-
永続的動的キューはシステム障害発生時に回復できます。
-
アプリケーション(MQOPEN命令を発行してキューを作成したアプリケーション以外も含む)は,MQCO_DELETEまたはMQCO_DELETE_PURGEオプションを使用してキューをクローズできます。
-
キューにコミット済みまたはコミット待ちのメッセージがある場合,MQCO_DELETEオプションでのクローズ要求は失敗します。MQCO_DELETE_PURGEオプションでのクローズ要求は,キューにコミット済みのメッセージがあるときだけ成功します。メッセージはクローズ処理の一部として削除されます。ただし,キューに未解決でコミット待ちのMQGET命令,MQPUT命令,またはMQPUT1命令があるときは失敗します。
-
削除要求は成功したが,キューが使用中(作成中,または他アプリケーションが使用中)の場合,キューは論理的に削除され,最後にキューを使用したアプリケーションがクローズするときに物理的に削除されます。
-
-
キューの削除を認証されていないアプリケーション(MQOPEN命令を発行してキューを作成したアプリケーションを除く)によってクローズされる場合には永続的動的キューは削除されません。
-
永続的動的キューはローカルキューと同様に削除できます。
(3) 動的キューの用途
ユーザは動的キューを次に示すアプリケーションで使用できます。
-
終了後にキューが保持されなくてもかまわないアプリケーション
-
他アプリケーションで処理されるメッセージの応答を要求するアプリケーション
モデルキューのオープンによって応答キューを動的に作成できます。
クライアントアプリケーションでの処理の例を次に示します。
-
動的キューを作成します。
-
問い合わせメッセージのメッセージ記述子のReplyToQフィールドに動的キューの名前を指定します。
-
サーバによって処理された要求をキューに登録します。
その後,サーバは応答キューに応答メッセージを登録します。最後に,クライアントアプリケーションは応答を処理して,削除オプションで応答キューをクローズします。
-
(4) 動的キューの検討項目
動的キューを使用する場合は,次に示す項目について検討してください。
-
クライアントサーバモデルでは,各クライアントアプリケーションで独自の動的応答キューを作成して使用してください。動的応答キューが複数のクライアントアプリケーションで共有される場合には,削除は遅延することがあります。これは,コミット待ちの未処理メッセージがあったり,他クライアントアプリケーションが使用中であったりするからです。さらに,キューが論理的に削除された状態になることによって,後続の命令(MQCLOSE命令を除く)でアクセスできないことがあります。
-
動的キューをアプリケーション間で共有する場合には,キューに対するすべての処理がコミットされたときに,キューを削除オプションでクローズするだけにしてください。最後にアクセスするユーザが実行することをお勧めします。これによって,キューの削除が遅延しなくなり,論理的に削除された状態であることからキューがアクセス不能になる時間を最小にします。