ActiveMQ: исключение «канал неактивен слишком долго» останавливает обмен сообщениями посредника
Моя система состоит из следующих частей:
Брокер ActiveMQ выставлен на tcp, порт 616163 Grails / Spring Wars, которые живут на своих собственных серверах Tomcat, они публикуют и принимают сообщения для JMS-брокера.n раз удаленная клиентская система с компонентом JMS-прослушивателя для получения клиентских сообщений, подключается к JMS-брокеру через VPN, используя имя хоста и порт 61616Пока что все отлично работает в среде разработки, тестирования и производства.
Мы только что подключили новую клиентскую систему к работе, и мы заметили, что ее журналы начинают сообщать об исключениях "канал был неактивен слишком долго" и сбрасывают соединение. Беспокоит общий эффект этого единственного клиента, заключающийся в том, что он останавливает потребление всех сообщений в брокере, что приводит к остановке всей системы.
Этот клиентский прослушиватель (использующий фабрику соединений Spring caching), по-видимому, подключается к JMS-брокеру, ок, обрабатывает некоторые сообщения, а затем через 3 минуты сообщает об исключении. Включил DEBUG в ActiveMQ и получил множество выходных данных, но ничего не предлагало предупреждение или ошибку на брокере в то же время.
Поверьте, что 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