ActiveMQ: „kanał nieaktywny zbyt długo” wyjątki zatrzymują przesyłanie wiadomości przez brokera
Mój system ma następujące części:
Broker ActiveMQ wystawiony na tcp, port 616163 wojny Grails / Spring, które żyją na własnych serwerach Tomcat, publikują i konsumują wiadomości do brokera JMSn razy zdalny system kliencki z komponentem nasłuchiwania JMS do odbierania komunikatów specyficznych dla klienta, połącz się z brokerem JMS za pośrednictwem sieci VPN, używając nazwy hosta i portu 61616Jak dotąd, wszystko działa poprawnie w środowiskach dev, Test i produkcji.
Właśnie podłączyliśmy nowy system kliencki w produkcji i zauważyliśmy, że jego dzienniki zaczynają raportować „kanał był zbyt długi” wyjątki i upuszcza połączenie. Niepokojący ogólny efekt tego jednego klienta polega na tym, że zatrzymuje on całe zużycie wiadomości na brokerze, więc cały system zostaje zatrzymany.
Ten odbiorca klienta (za pomocą fabryki połączeń Spring caching) wydaje się łączyć z brokerem JMS, przetwarzać niektóre komunikaty, a następnie 3 minuty zgłasza wyjątek. Włączono DEBUG w ActiveMQ i uzyskano mnóstwo danych wyjściowych, ale nic nie wskazywało na ostrzeżenie lub błąd w brokerze w tym samym czasie.
Uwierz, że ActiveMQ ma jakieś wewnętrzne utrzymanie, które powinno utrzymywać połączenie, nawet jeśli jest nieaktywne dłużej niż domyślnie 30 sekund.
Faceci z infrastruktury monitorowali VPN tego klienta i potwierdzają, że pozostaje on włączony i podłączony przez cały czas.
Nie wierz, że to wina kodu lub Springa, ponieważ mamy wiele innych instancji słuchacza u różnych klientów i wszyscy zachowują się dobrze.
Załóżmy, że mam naprawdę 2 pytania:
Co powoduje wyjątki „nieaktywny kanał”?Dlaczego ten wyjątek w pojedynczym kliencie zatrzymuje działanie ActiveMQ?EDIT - dodawanie wyjątku 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