4.3.7 動的キュー
(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命令を除く)でアクセスできないことがあります。
- 動的キューをアプリケーション間で共有する場合には,キューに対するすべての処理がコミットされたときに,キューを削除オプションでクローズするだけにしてください。最後にアクセスするユーザが実行することをお勧めします。これによって,キューの削除が遅延しなくなり,論理的に削除された状態であることからキューがアクセス不能になる時間を最小にします。