ActiveMQ Неожиданный сбой от FailoverTransport

У меня есть (довольно) сложное Java-приложение, которое использует Camel (2.11.0) и ActiveMQ (5.8.0) для отправки сообщений между маршрутом Camel и различными очередями ActiveMQ. Конечная точка Camel-ActiveMQ, которую я использую, определяет отработку отказа следующим образом:

failover:(tcp://myBroker01.example.com:61616)?jms.prefetchPolicy.queuePrefetch=1&randomize=false&maxReconnectDelay=250

Вы заметите, что у меня определен только один брокер; на данный момент у меня есть только 1 брокер (и, таким образом, это сводит на нет полезность переноса при сбое), но в будущем у меня может быть несколько посредников как часть этого отказоустойчивого URI.

Когда я запускаю свое приложение, я вижу следующую ошибку в журналах моего приложения:

org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[Message: <com.me.myapp.model.WidgetVO>
    ...middle portion of stack trace omitted for brevity; probably irrelevant
Caused by: javax.jms.JMSException: Unexpected failure.
    at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:62)
    at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1409)
    at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1496)
    at org.apache.activemq.ActiveMQConnection.createSession(ActiveMQConnection.java:325)
    at org.apache.activemq.pool.ConnectionPool$2.makeObject(ConnectionPool.java:105)
    at org.apache.activemq.pool.ConnectionPool$2.makeObject(ConnectionPool.java:90)
    at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:1220)
    at org.apache.activemq.pool.ConnectionPool.createSession(ConnectionPool.java:142)
    at org.apache.activemq.pool.PooledConnection.createSession(PooledConnection.java:174)
    at org.springframework.jms.support.JmsAccessor.createSession(JmsAccessor.java:196)
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:457)
    ... 76 more
Caused by: java.io.IOException: Unexpected failure.
    at org.apache.activemq.transport.failover.FailoverTransport.oneway(FailoverTransport.java:620)
    at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:68)
    at org.apache.activemq.transport.ResponseCorrelator.asyncRequest(ResponseCorrelator.java:81)
    at org.apache.activemq.transport.ResponseCorrelator.request(ResponseCorrelator.java:86)
    at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1380)
    ... 85 more

Таким образом, похоже, что Camel правильно читает мою конфигурацию переноса при сбое и пытается асинхронно отправить (oneway(...)) сериализованный WidgetVO сообщение в мою очередь. Я искал GrepCode для строки 620FailoverTransport и вот блок кода, из которого выдается исключение:

if (transport == null) {
    // Previous loop may have exited due to use being
    // disposed.
    if (disposed) {
        error = new IOException("Transport disposed.");
    } else if (connectionFailure != null) {
        error = connectionFailure;
    } else if (timedout == true) {
        error = new IOException("Failover timeout of " + timeout + " ms reached.");
    } else {
        error = new IOException("Unexpected failure.");
    }

    break;
}

Итак Transport имеет значение NULL, однако сообщение не было помечено для удаления, а также не было сбоя подключения, а также не истекло время нашего подключения к брокеру.

Значит ли это что-нибудь для кого-нибудь? Кто-нибудь может дать мне несколько советов о том, как начать отладку этого? Я рад опубликовать больше кода, если это необходимо.

Обновление: Вот еще одно сообщение ПРЕДУПРЕЖДЕНИЕ, которое я вижу в журнале моего приложения до создания исключения:

07:53:00,306 WARN  [DefaultJmsMessageListenerContainer] Rejecting received message because of
the listener container having been stopped in the meantime: ActiveMQTextMessage {commandId
= 7, responseRequired = true, messageId = ID:<myserver.example.com>, originalDestination = null,
originalTransactionId = null, producerId = ID:<myserver.example.com>, destination = queue://myQueue,
transactionId = null, expiration = 0, timestamp = 1392295980294, arrival = 0,
brokerInTime = 1392295980297, brokerOutTime = 1392295980298, correlationId = null, replyTo = null,
persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0,
targetConsumerId = null, compressed = false, userID = null, content = null,
marshalledProperties = org.apache.activemq.util.ByteSequence@2d0b20f5, dataStructure = null,
redeliveryCounter = 0, size = 0, properties = {breadcrumbId=ID-<myserver.example.com>},
readOnlyProperties = true, readOnlyBody = true, droppable = false, text = <com.me.myapp.WidgetVO>
 ...WidgetVO>}

Я должен был явно изменить все имена серверов на <myserver.example.com> в целях безопасности. Я думал, что это было интересно, что transactionId нулевой...

0 ответов

Другие вопросы по тегам