Проблема автосоединения с ActiveMQ и CachingConnectionFactory
У меня проблема с ActiveMQ и Spring'S 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
использует транспорт отработки отказа:
failover:(tcp://firstbox:6166,tcp://secondbox:6166)?timeout=3000
Проблема, с которой я сталкиваюсь, заключается в том, что если один ящик отключается, мы должны начать отправлять сообщения на другой, но, похоже, он все еще использует старое соединение (каждое время отправки). Если я перезапущу программу, она снова подключится, и все будет работать.
Мое понимание состоит в том, что ActiveMQConnectionFactory
должен исправить себя (повторно подключиться к новому box), и JmsTemplate
должен запрашивать новое соединение каждый раз, так что все должно быть в порядке. Мне интересно, может ли CachingConnectionFactory
делать что-то плохое (кэширование производителя, который разговаривает со старым сервером?).
Я упустил что-то, что мне нужно сделать здесь? Моя установка кажется довольно нормальной, но я не могу найти никого, кто бы имел эту проблему.
2 ответа:
Проблема, с которой я столкнулся, заключалась в том, что ActiveMQ не сообщал
CachingConnectionFactory
при повторном подключении, поэтому кэшированное соединение все еще использовалось. Я заменил его на ActiveMQPooledConnectionFactory
, и проблема исчезла.
К вашему сведению, я только что протестировал этот сценарий (используя CachingConnectionFactory для обоих соединений производителя/потребителя) между двумя локальными брокерами AMQ, и отработка отказа сработала нормально...
Как говорится...Я вижу другие проблемы с подключением потребителей при использовании шаблона опроса потребителей...должно быть, нужно вручную закрыть соединения или что-то еще.