Interstage JMSは、以下の高信頼な機能を提供します。
異常時のメッセージ退避
以下のような理由でシステムから破棄されたメッセージを、デッドメッセージと呼びます。
メッセージブローカが検出した有効期限切れのメッセージ
保持可能なメッセージ上限を超えたため、物理格納先から破棄されたメッセージ
Message-driven Beanアプリケーションへの同一メッセージの配信処理が2回連続で失敗したメッセージ
メッセージブローカは、メッセージの有効期限切れを以下のように検出します。
imq.message.expiration.intervalプロパティに設定した間隔(デフォルト60秒)でメッセージの有効期限切れを検出します。
コンシューマにメッセージを事前配信する際にメッセージの有効期限切れを検出します。
コンシューマが事前配信されたメッセージを一時格納域から受信する際にメッセージの有効期限切れを検出します。
imq.message.expiration.intervalプロパティの詳細については、「8.7.2 ルーティングサービスに関するプロパティ」を参照してください。
メッセージブローカは、起動時に自動的にデッドメッセージを配置するデッドメッセージキューを作成します。
デッドメッセージキューには、「mq.sys.dmq」という固有の物理格納先の名前が設定され、削除できません。デッドメッセージキューに明示的にメッセージを送信することもできません。
また、メッセージブローカは、デッドメッセージをデッドメッセージキューに配置します。
異常時のメッセージ退避機能の使用
異常時のメッセージ退避機能は、デフォルトで有効になっています。メッセージ退避機能の使用有無は、useDMQプロパティで設定します。
useDMQプロパティの詳細については、「8.7.7 物理格納先の生成または更新に関するプロパティ」を参照してください。
例
異常時のメッセージ退避機能を使用しないように変更するコマンド実行例
C:\Interstage\F3FMisje7\mq\bin\imqcmd update dst -b localhost:27676 -n JMSQueue -t q -o useDMQ=false
/opt/FJSVisje7/mq/bin/imqcmd update dst -b localhost:27676 -n JMSQueue -t q -o useDMQ=false
デッドメッセージキューの管理
imqcmdコマンドを使用して、デッドメッセージキューを他の物理格納先と同じように管理できますが、以下の相違点があります。
デッドメッセージキューの作成/削除を行うことはできません。
デッドメッセージキューのプロパティ省略値は、通常の物理格納先と異なります。
プロパティ | 通常の物理格納先との差異 | デッドメッセージキューの省略値 | その他の物理格納先の省略値 |
---|---|---|---|
limitBehavior | FLOW_CONTROLはサポートされません。 | REMOVE_OLDEST | REJECT_NEWEST |
maxNumMsgs | - | 1000 | -1(無制限) |
maxNumProducers | 変更できません。 | 0 | 100 |
maxTotalMsgBytes | - | 10m | -1(無制限) |
useDMQ | trueはサポートされません。 | false | true |
プロパティの詳細については、「8.7.7 物理格納先の生成または更新に関するプロパティ」を参照してください。
メッセージの内容
メッセージブローカは、メッセージ全体をデッドメッセージキューに配置できます。または、ヘッダーとプロパティデータだけを残して、メッセージ本体の内容を破棄できます。デフォルトでは、デッドメッセージキューはメッセージ全体を格納します。
デッドメッセージを復元する予定がない場合は、imq.destination.DMQ.truncateBodyプロパティを「true」に設定してください。これにより、メッセージ本文が破棄され、ヘッダーとプロパティデータだけが残され、デッドメッセージキューのサイズを減らすことができます。
imq.destination.DMQ.truncateBodyプロパティの詳細については、「8.7.2 ルーティングサービスに関するプロパティ」を参照してください。
例
メッセージ本文を破棄してデッドメッセージキューに退避するように設定する例
C:\Interstage\F3FMisje7\mq\bin\imqbrokerd -Dimq.destination.DMQ.truncateBody=true
/opt/FJSVisje7/mq/bin/imqbrokerd -Dimq.destination.DMQ.truncateBody=true
デッドメッセージのロギング
デッドメッセージのロギングとは、以下の事象が発生した場合、メッセージブローカがログ情報を記録する機能です。
メッセージブローカが、デッドメッセージキューにメッセージを移動する。
メッセージブローカが、デッドメッセージキューとデッドメッセージキューを使用していない物理格納先からメッセージを破棄する。
物理格納先が制限に達する。
デッドメッセージのロギングは、デフォルトでは無効になっています。デッドメッセージのロギングは、imq.destination.logDeadMsgsプロパティで設定します。デッドメッセージのロギングは、デッドメッセージキューを使用するすべての物理格納先に適用されます。物理格納先ごとに、ロギングの有効/無効を設定することはできません。
imq.destination.logDeadMsgsプロパティの詳細については、「8.7.6 ログ機能に関するプロパティ」を参照してください。
例
デッドメッセージのロギングを有効にする例
C:\Interstage\F3FMisje7\mq\bin\imqbrokerd -Dimq.destination.logDeadMsgs=true
/opt/FJSVisje7/mq/bin/imqbrokerd -Dimq.destination.logDeadMsgs=true
デッドメッセージキューからのメッセージの復元
デッドメッセージキューに移動されたメッセージは、Interstage JMSのキューブラウザ機能を使用して参照します。
デッドメッセージキューをJMSクライアントアプリケーション内で使用する場合は、以下のAPIを使用して、デッドメッセージキューを取得してください。
javax.jms.Session#createQueue(String)
javax.jms.JMSContext#createQueue(String)
例
javax.jms.Session#createQueue(String)でデッドメッセージキューを取得する場合の例
Queue deadMessageQueue = session.createQueue("mq.sys.dmq") ;
デッドメッセージキューからのメッセージの破棄
デッドメッセージキューに移動されたメッセージが不要となった場合は、imqcmdコマンドで破棄します。詳細については、「10.6.11 purge dstサブコマンド」を参照してください。
例
デッドメッセージキューからメッセージを破棄するコマンド実行例
C:\Interstage\F3FMisje7\mq\bin\imqcmd purge dst -b localhost:27676 -t q -n mq.sys.dmq
/opt/FJSVisje7/mq/bin/imqcmd purge dst -b localhost:27676 -t q -n mq.sys.dmq