症状は次のとおりです。
持続メッセージを送信したときに、send メソッドが戻らずクライアントがブロックする。
持続メッセージを送信したときに、クライアントが例外を受け取る。
プロデューシングクライアントの処理速度が低下する。
考えられる原因:
考えられる原因: ブローカがバックログされ、メッセージプロデューサの処理速度を低下させることによって対処される。
バックログされたブローカでは、ブローカメモリーにメッセージが蓄積します。物理的送信先メモリー内のメッセージ数またはメッセージのバイト数が設定された制限に達すると、ブローカは指定された制限の動作に従いメモリーリソースを節約しようとします。次の制限の動作により、メッセージプロデューサの処理速度が低下します。
FLOW_CONTROL: ブローカが持続メッセージの受信を即時に通知せず、プロデューシングクライアントがブロックされる。
REJECT_NEWEST: ブローカが新しい持続メッセージを拒否する。
同様に、ブローカ全体のメモリー内 (すべての物理的送信先に対応) のメッセージ数またはメッセージのバイト数が設定済みの制限に達すると、ブローカは最新のメッセージを拒否してメモリーリソースを節約しようとします。また、物理的送信先またはブローカ全体の制限が適切に設定されていないために、システムメモリーの制限に達すると、ブローカはさらに大規模なアクションを実行してメモリーの過負荷を防ぎます。このアクションには、メッセージプロデューサを徐々に減らすことなどがあります。
この問題の原因を確認するには: 設定済みのメッセージ制限が原因でブローカによってメッセージが拒否された場合は、ブローカが次の例外を返します。
JMSException [C4036]: A server error occurred
また、ブローカログに次のエントリを作成します。
[B2011]: Storing of JMS message from IMQconn failed
このメッセージには、到達した制限を示す別のメッセージが続きます。
[B4120]: Cannot store message on destination destName because capacity of maxNumMsgs would be exceeded.
これは、物理的送信先上でメッセージが制限されている場合です。
[B4024]: The maximum number of messages currrently in the system has been exceeded, rejecting message.
これは、ブローカ全体でメッセージが制限されている場合です。
より一般的には、拒否が発生する前に、次のようにメッセージ制限条件を確認します。
物理的送信先とブローカを照会し、設定されているメッセージ制限の設定を調べます。
適切な imqcmd コマンドを使用し、物理的送信先かブローカ全体に現在あるメッセージの数かバイト数を監視します。監視できるメトリックス、およびメトリックスの取得に使用するコマンドについては、第 18 章「メトリックスのリファレンス」を参照してください。
問題を解決するには:
物理的送信先またはブローカ全体のメッセージ制限を、メモリーリソースを超えないように注意しながら変更します。
一般に、ブローカ全体のメッセージ制限に達しないように、送信先単位でメモリーを管理する必要があります。詳細については、「ブローカの調整」を参照してください。
メッセージ制限に達したときに、メッセージの生成が低速化しないようにする代わりに、メモリー内のメッセージを廃棄するよう、送信先の制限の動作を変更します。
たとえば、メモリーに累積されたメッセージを削除する REMOVE_OLDEST および REMOVE_LOW_PRIORITY といった制限の動作を指定できます (表 15–1 を参照)。
考えられる原因: ブローカが持続メッセージをデータストアに保存できない。
ブローカがデータストアにアクセスできないか、または持続メッセージを書き込めない場合は、プロデューシングクライアントがブロックされます。前に述べたとおり、この状態は、送信先またはブローカ全体のメッセージ制限に達したときにも発生します。
この問題の原因を確認するには: ブローカは、データストアに書き込めない場合には、ブローカログに次のエントリのいずれかを作成します。
[B2011]: Storing of JMS message from connectionID failed [B4004]: Failed to persist message messageID
問題を解決するには:
ファイルベースの持続の場合は、ファイルベースのデータストアのディスク容量を増やしてみます。
JDBC 互換のデータストアの場合は、JDBC ベースの持続が正しく設定されていることを確認します (「持続データストアの設定」を参照)。正しく設定されている場合は、データベース管理者にほかのデータベース問題の解決を依頼します。
考えられる原因: ブローカによる通知のタイムアウトが短すぎる。
低速な接続または、CPU 使用率が高いかメモリーリソースが不十分なためにブローカの能力が低下したことが原因で、ブローカが持続メッセージの受信を通知するまでに、接続ファクトリの imqAckTimeout 属性値で許容されている以上の時間を必要としている可能性があります。
この問題の原因を確認するには: imqAckTimeout 値を超えると、ブローカは次の例外を返します。
JMSException [C4000]: Packet acknowledge failed
問題を解決するには: imqAckTimeout 接続ファクトリ属性の値を変更します (「信頼性およびフロー制御」を参照)。
考えられる原因: プロデューシングクライアントが JVM 制限に達している。
この問題の原因を確認するには:
クライアントアプリケーションがメモリー不足エラーを受け取ったかどうかを確認します。
freeMemory、MaxMemory、totalMemory などのランタイムメソッドを使用して JVM ヒープの使用可能な空きメモリーを確認します。
問題を解決するには: JVM を調整します (「Java 仮想マシン (JVM) の調整」を参照)。