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
нулевой...