2013-06-05 2 views
2

мы используем ActiveMQ 5.8.0 для подключения нашего приложения Java через TCP к другой системе. Запрос/ответ (синхронно с ответом на временную очередь) отлично работает с нашим клиентом и его соответствующей частью.Подключитесь к серверу ActiveMQ после сбоя сети

Но мы не уверены в том, как обращаться с «ненормальными» ситуациями, такими как, например, короткий сетевой сбой. Мы тестируем, если приложение может продолжить свою работу нормально после повторного подключения сокета.

Но до сих пор мы не могли справиться с этим, потому что клиент, похоже, не автоматически подключается к брокеру, как ожидалось. Мы подумали о том, чтобы внедрить его самостоятельно в собственный TransportListener, но это не рекомендуется (см. Transport Listener and ActiveMq restart, где член ActiveMQ Тим Бич намекает использовать протокол отказоустойчивости). Но переход на другой ресурс просто переключается на другого брокера, если он падает, верно?

В настоящее время мы используем TransportListener только для контроля состояния соединения в файле журнала, что приводит к некоторым логическим записям, например, следующим или похожим (размещен в длинном журнале ниже).

ActiveMQ Executor Подключение: ... Производитель получил: java.net.SocketException: ...

class ConnectionStateMonitor 
    implements TransportListener 
{ 
    @Override 
    public void onCommand(Object command) 
    { 
     logInfo("Producer received: " + command); 
    } 

    @Override 
    public void onException(IOException exception) 
    { 
     logError("Producer received: " + exception); 
    } 

    @Override 
    public void transportInterupted() 
    { 
     logError("Producer received transport interuption."); 
    } 

    @Override 
    public void transportResumed() 
    { 
     logInfo("Producer received transport resumption."); 
    } 
} 

К сожалению, для размещения длинный лог отрывка с stacktraces ниже, но, возможно, кто-то сразу видит то, чего не хватает.

В настоящее время мы работаем со следующими параметрами:

  • wireFormat.maxInactivityDuration = 20000
  • максимальное время ожидания ответа: 10000 мс

Любые идеи, как решить эту проблему (и как форматировать довольно журнал ниже)?

Заранее благодарен!

2013-06-05 14: 09: 21,676 | главная | Сигнал | DEBUG | Wait For +60000 2013-06-05 14: 09: 30,279 | ActiveMQ InactivityMonitor WriteCheckTimer | AbstractInactivityMonitor | DEBUG | WriteChecker 6666 мс прошло с момента последней проверки записи. 2013-06-05 14: 09: 30282 | ActiveMQ InactivityMonitor работник | AbstractInactivityMonitor | DEBUG | Запуск WriteCheck [TCP: //192.168.1.29: 61616] 2013-06-05 14: 09: 36945 | ActiveMQ InactivityMonitor WriteCheckTimer | AbstractInactivityMonitor | DEBUG | WriteChecker 6666 ms прошло с момента последней проверки записи. 2013-06-05 14: 09: 36945 | ActiveMQ InactivityMonitor работник | AbstractInactivityMonitor | DEBUG | Запуск WriteCheck [TCP: //192.168.1.29: 61616] 2013-06-05 14: 09: 40579 | ActiveMQ Транспорт: tcp: //test-server/192.168.1.29: 61616 @ 54127 | ThreadPoolUtils | DEBUG | Shutdown of ExecutorService: [email protected] is shutdown: true и завершено: false занял: 0.000 секунд. Вызвано: javax.jms.JMSException: соединение сброшено на org.apache.activemq.util.JMSExceptionSupport.create (JMSExceptionSupport.Java: 49) на org.apache.activemq.ActiveMQConnection.syncSendPacket (ActiveMQConnection.java:1391) на org.apache.activemq.ActiveMQSession.syncSendPacket (ActiveMQSession.java:1912) на org.apache.activemq .ActiveMQMessageProducer. (ActiveMQMessageProducer.java:125) на org.apache.activemq.ActiveMQSession.createProducer (ActiveMQSession.java:956) на de.wer.services.activemq.ActiveMqConnectionImpl.sendRequest (ActiveMqConnectionImpl.java:218) ... 4 еще 2013-06-05 14: 09: 40,579 | ActiveMQ Транспорт: tcp: //test-server/192.168.1.29: 61616 @ 54127 | ActiveMQConnection | DEBUG | Async исключение с нет прослушивателя исключений: java.net.SocketException: Сброс соединения java.net.SocketException: Сброс соединения: java.net.SocketInputStream.read (Неизвестный источник) в org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill (TcpBufferedInputStream.java:50) на org.apache.activemq.transport.tcp.TcpTransport $ 2.fill (TcpTransport.java:604) на org.apache.activemq.transport.tcp.TcpBufferedInputStream.read (TcpBufferedInputStream.java : 58) на org.apache.activemq.transport.tcp.TcpTransport $ 2.read (TcpTransport.java:589) в java.io.DataInputStream.readInt (Unknown Source) в org.apache.activemq.openwire. OpenWireFormat.unmarshal (OpenWireFormat.java:2 75) на org.apache.activemq.transport.tcp.TcpTransport.readCommand (TcpTransport.java:221) на org.apache.activemq.transport.tcp.TcpTransport.doRun (TcpTransport.java:213) на org.apache.activemq.transport.tcp.TcpTransport.run (TcpTransport.java:196) в java.lang.Thread.run (Unknown Source) причиненном: сброс соединения в Java: java.net.SocketException. net.SocketInputStream.read (Unknown Source) на org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill (TcpBufferedInputStream.java:50) в org.apache.activemq.transport.tcp.TcpTransport $ 2.fill (TcpTransport .java: 604) по адресуorg.apache.activemq.transport.tcp.TcpBufferedInputStream.read (TcpBufferedInputStream.java:58) в org.apache.activemq.transport.tcp.TcpTransport $ 2.Read (TcpTransport.java:589) в java.io .DataInputStream.readInt (Unknown Source) на org.apache.activemq.openwire.OpenWireFormat.unmarshal (OpenWireFormat.java:275) на org.apache.activemq.transport.tcp.TcpTransport.readCommand (TcpTransport.java:221) на org.apache.activemq.transport.tcp.TcpTransport.doRun (TcpTransport.java:213) на org.apache.activemq.transport.tcp.TcpTransport.run (TcpTransport.java:196) .. . 1 еще 2013-06-05 14: 09: 40,583 | Act iveMQ Connection Исполнитель: tcp: //test-server/192.168.1.29: 61616 @ 54127 | TcpTransport | DEBUG | Остановка транспорт tcp: //test-server/192.168.1.29: 61616 @ 54127 2013-06-05 14 : 09: 40583 | ActiveMQ Подключение Исполнитель: ТСР: //test-server/192.168.1.29: 61616 @ 54127 | TaskRunnerFactory | DEBUG | Initialized TaskRunnerFactory [ActiveMQ Task] с помощью ExecutorService: [email protected] 2013-06-05 14: 09: 40,584 | ActiveMQ Task-1 | TcpTransport | DEBUG | Закрытое гнездо Socket [addr = test-server/192.168.1.29, port = 61616, localport = 54127] Вызвано: javax. jms.JMSException: сбой соединения: org.apache.activemq.util.JMSExceptionSupport.create (JMSExceptionSupport.Java: 49) на org.apache.activemq.ActiveMQConnection.syncSendPacket (ActiveMQConnection.java:1391) на org.apache.activemq.ActiveMQSession.syncSendPacket (ActiveMQSession.java:1912) на org.apache.activemq .ActiveMQMessageProducer. <INIT> (ActiveMQMessageProducer.java:125) на org.apache.activemq.ActiveMQSession.createProducer (ActiveMQSession.java:956) на de.wer.services.activemq.ActiveMqConnectionImpl.sendRequest (ActiveMqConnectionImpl.java:218) ... 4 Еще вызвано: java.net.SocketException: соединение сбрасывается при java.net.SocketInputStream.read (неизвестный источник) в org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill (TcpBufferedInputStream.java: 50) на org.apache.activemq.transport.tcp.TcpTransport $ 2.fill (TcpTransport.java:604) на org.apache.activemq.transport.tcp.TcpBufferedInputStream.read (TcpBufferedInpu tStream.java:58) на org.apache.activemq.transport.tcp.TcpTransport $ 2.Read (TcpTransport.java:589) в java.io.DataInputStream.readInt (Unknown Source) в org.apache.activemq .openwire.OpenWireFormat.unmarshal (OpenWireFormat.java:275) на org.apache.activemq.transport.tcp.TcpTransport.readCommand (TcpTransport.java:221) на org.apache.activemq.transport.tcp.TcpTransport .doRun (TcpTransport.java:213) at org.apache.activemq.transport.tcp.TcpTransport.run (TcpTransport.java:196) ... 1 еще 2013-06-05 14: 09: 40,584 | ActiveMQ Исполнитель подключения: tcp: //test-server/192.168.1.29: 61616 @ 54127 | ThreadPoolUtils | DEBUG | Forcingотключение ExecutorService: [email protected] вызвано следующими причинами: javax.jms.JMSException: Подключение сброса на org.apache.activemq.util.JMSExceptionSupport.create (JMSExceptionSupport.java:49) в org.apache.activemq.ActiveMQConnection.syncSendPacket (ActiveMQConnection.java:1391) на org.apache.activemq.ActiveMQSession.syncSendPacket (ActiveMQSession.java:1912) на org.apache.activemq.ActiveMQMessageProducer. (ActiveMQMessageProducer.java : 125) по адресу org.apache.activemq.ActiveMQSession.createProducer (ActiveMQSession.java:956) по адресу de .wer.services.activemq.ActiveMqConnectionImpl.sendRequest (ActiveMqConnectionImpl.java:218) ... 4 more Причиняется: java.net.SocketException: Сброс соединения на java.net.SocketInputStream.read (Неизвестный источник) на org .apache.activemq.transport.tcp.TcpBufferedInputStream.fill (TcpBufferedInputStream.java:50) в org.apache.activemq.transport.tcp.TcpTransport $ 2.fill (TcpTransport.java:604) на org.apache. activemq.transport.tcp.TcpBufferedInputStream.read (TcpBufferedInputStream.java:58) на org.apache.activemq.transport.tcp.TcpTransport $ 2.Read (TcpTransport.java:589) в java.io.DataInputStream.readInt (Неизвестный источник) в org.apache.activemq.openwire .OpenWireFormat.unmarshal (OpenWireFormat.java:275) на org.apache.activemq.transport.tcp.TcpTransport.readCommand (TcpTransport.java:221) на org.apache.activemq.transport.tcp.TcpTransport.doRun (TcpTransport.java:213) по адресу org.apache.activemq.transport.tcp.TcpTransport.run (TcpTransport.java:196) ...1 еще 2013-06-05 14: 09: 40,587 | Исполнитель подключения ActiveMQ: tcp: //test-server/192.168.1.29: 61616 @ 54127 | ActiveMqConnectionImpl | ERROR | Полученный производитель: java.net.SocketException: Сброс соединения

ответ

9

Звучит как переход на другой ресурс - это определенно то, что вы хотите использовать. Вам не нужно отказываться от другого брокера - URI просто поручает клиентской библиотеке повторно подключиться, так что вы можете сделать что-то вроде:

failover:(tcp://myBroker:61616) 
+1

+1. Вот ссылка от ActiveMQ: [Как поддерживать автоматическое повторное подключение] (http://activemq.apache.org/how-can-i-support-auto-reconnection.html) – brainOverflow

+0

Спасибо, ребята! Я, очевидно, пропустил эту легкую, но важную часть документа ActiveMQ: - | – Mayoares

+0

Используются ли эти преимущества при использовании транспорта 'vm'? Открыл отдельный вопрос об этом здесь: https://stackoverflow.com/questions/47530980/are-there-any-benefits-in-using-the-failover-protocol-with-the-vm-transpor – nwinkler