私のシステムには次の部分があります。
- 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つの質問があるとします:
- 「チャネル非アクティブ」例外の原因は何ですか?
- 単一のクライアントでこの例外が発生すると、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