9

私のシステムには次の部分があります。

  • tcp、ポート 61616 で公開されている ActiveMQ ブローカー
  • 独自の Tomcat サーバーに存在する 3 つの Grails/Spring wars は、JMS ブローカーにメッセージを公開および消費します。
  • クライアント固有のメッセージを受信する JMS リスナー コンポーネントを備えたリモート クライアント システムを n 回、ホスト名とポート 61616 を使用して VPN 経由で JMS ブローカに接続します。

これまでのところ、開発環境、テスト環境、および本番環境ですべて正常に動作しています。

本番環境で新しいクライアント システムを接続したところ、ログで「チャネルが非アクティブな状態が長すぎる」という例外が報告され始め、接続が切断されていることがわかりました。この 1 つのクライアントの全体的な影響が懸念されるのは、ブローカーでのすべてのメッセージの消費が停止するため、システム全体が停止することです。

このクライアント リスナー (Spring キャッシング接続ファクトリを使用) は、JMS ブローカーに正常に接続しているように見え、いくつかのメッセージを処理し、3 分後に例外が報告されます。ActiveMQ で DEBUG をオンにすると、大量の出力が得られましたが、同時にブローカーで警告やエラーを示唆するものは何もありませんでした。

ActiveMQ には、デフォルトの 30 秒より長く非アクティブな場合でも接続を維持する内部キープアライブがあると考えてください。

インフラ担当者は、このクライアントの VPN を監視し、常に稼働して接続されていることを確認しました。

異なるクライアントにリスナーの他のインスタンスが多数あり、それらはすべて正常に動作するため、コードまたはSpring構成に問題があるとは思わないでください。

本当に2つの質問があるとします:

  1. 「チャネル非アクティブ」例外の原因は何ですか?
  2. 単一のクライアントでこの例外が発生すると、ActiveMQ が機能しなくなるのはなぜですか?

編集 - 例外スタックトレースを追加:

2013-04-24 14:02:06,359 WARN  - Encountered a JMSException - resetting the underlying JMS Connection (org.springframework.jms.connection.CachingConnectionFactory)
javax.jms.JMSException: Channel was inactive for too (>30000) long: jmsserver/xxx.xx.xx.xxx:61616
    at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49)
    at org.apache.activemq.ActiveMQConnection.onAsyncException(ActiveMQConnection.java:1833)
    at org.apache.activemq.ActiveMQConnection.onException(ActiveMQConnection.java:1850)
    at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
    at org.apache.activemq.transport.ResponseCorrelator.onException(ResponseCorrelator.java:126)
    at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
    at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
    at org.apache.activemq.transport.WireFormatNegotiator.onException(WireFormatNegotiator.java:160)
    at org.apache.activemq.transport.InactivityMonitor.onException(InactivityMonitor.java:266)
    at org.apache.activemq.transport.InactivityMonitor$4.run(InactivityMonitor.java:186)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:693)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:719)
    at java.lang.Thread.run(Thread.java:813)
Caused by: org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: jmsserver/xxx.xx.xx.xxx:61616
    ... 4 more
4

2 に答える 2