2011-05-06 21 views
5

Tengo un problema con ActiveMQ y Spring's CachingConnectionFactory. Los estoy configuración de la siguiente manera:Problema de Autoreconnect con ActiveMQ y CachingConnectionFactory

<!-- A connection to ActiveMQ --> 
<bean id="myConnectionFactory" 
    class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="${jms.url}"/> 
    <property name="userName" value="${jms.username}"/> 
    <property name="password" value="${jms.password}"/> 
</bean> 

<!-- A cached connection to wrap the ActiveMQ connection --> 
<bean id="myCachedConnectionFactory" 
    class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <property name="targetConnectionFactory" ref="myConnectionFactory"/> 
    <property name="sessionCacheSize" value="10"/> 
    <property name="reconnectOnException" value="true"/> 
</bean> 

<!-- A destination in ActiveMQ --> 
<bean id="myDestination" 
    class="org.apache.activemq.command.ActiveMQQueue"> 
    <constructor-arg value="${jms.queue}" /> 
</bean> 

<!-- A JmsTemplate instance that uses the cached connection and destination --> 
<bean id="myProducerTemplate" 
    class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="myCachedConnectionFactory"/> 
    <property name="defaultDestination" ref="myDestination"/> 
</bean> 

jms.url está utilizando el transporte de conmutación por error:

failover:(tcp://firstbox:6166,tcp://secondbox:6166)?timeout=3000 

El problema que estoy teniendo es que si un cuadro se cae, hay que empezar a enviar mensajes de el otro, pero parece seguir usando la conexión anterior (cada envío expira). Si reinicio el programa, se volverá a conectar y todo funciona.

Según tengo entendido, el ActiveMQConnectionFactory debería arreglarse a sí mismo (reconectarse a un nuevo cuadro), y el JmsTemplate debería solicitar una nueva conexión cada vez, por lo que debería estar bien. Me pregunto si el CachingConnectionFactory podría estar haciendo algo malo (¿almacenar en caché a un productor que hable con el servidor anterior?).

¿Me falta algo que tengo que hacer aquí? Mi configuración parece bastante normal, pero no puedo encontrar a nadie más teniendo este problema.

Respuesta

5

El problema que estaba teniendo es que ActiveMQ no estaba diciendo el CachingConnectionFactory cuando se volvió a conectar, por lo que la conexión en caché aún se estaba utilizando. Lo reemplacé con el PooledConnectionFactory de ActiveMQ y el problema desapareció.

3

FYI, Acabo de probar este escenario (usando CachingConnectionFactory para ambas conexiones productor/consumidor) entre dos corredores AMQ locales y la conmutación por error funcionó bien ...

dicho esto ... estoy viendo otra Consumidor problemas de conexión cuando usa un patrón de consumidor de sondeo ... debe necesitar cerrar conexiones manualmente o algo así.