ActiveMQ: las excepciones de 'canal inactivo por demasiado tiempo' detienen la mensajería del agente
Mi sistema tiene las siguientes partes:
Broker ActiveMQ expuesto en tcp, puerto 616163 guerras Grails / Spring que viven en sus propios servidores Tomcat, publican y consumen mensajes al agente JMSn veces el sistema cliente remoto con un componente de escucha JMS para recibir mensajes específicos del cliente, conéctese al agente JMS a través de VPN utilizando un nombre de host y el puerto 61616Hasta ahora, todo funciona bien en los entornos de desarrollo, prueba y producción.
Acabamos de conectar un nuevo sistema cliente en producción y nos hemos dado cuenta de que los registros comienzan a informar de que "el canal estuvo inactivo durante demasiado tiempo" y deja de lado la conexión. Lo que preocupa el efecto general de este cliente es que detiene todo el consumo de mensajes en el intermediario, por lo que todo el sistema se detiene.
Este escucha del cliente (utilizando la fábrica de conexiones de almacenamiento en caché de Spring) parece que se conecta con el agente JMS, procesa algunos mensajes y luego 3 minutos informa de la excepción. Activó DEBUG en ActiveMQ y obtuvo un montón de resultados, aunque nada sugiere una advertencia o un error en el agente casi al mismo tiempo.
Cree que ActiveMQ tiene algo de mantenimiento interno que debería mantener la conexión, incluso si está inactiva durante más tiempo que los 30 segundos predeterminados.
Los tipos de infraestructura han monitoreado el VPN de este cliente y confirman que permanece activo y conectado todo el tiempo.
No crea que es el código o la configuración de Spring el que tiene la culpa, ya que tenemos muchas otras instancias del oyente en diferentes clientes y todos se comportan bien.
Supongamos que tengo 2 preguntas realmente:
¿Qué está causando excepciones de 'canal inactivo'?¿Por qué esta excepción en un solo cliente impide que ActiveMQ funcione?EDITAR - agregando la excepción stacktrace:
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