Проблема автоподключения с ActiveMQ и CachingConnectionFactory - PullRequest
5 голосов
/ 07 мая 2011

У меня проблема с ActiveMQ и Spring'ом 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 должен исправить себя (переподключиться к новой коробке), а JmsTemplate должен запросить новуюсвязь каждый раз, так что должно быть в порядке.Мне интересно, может ли CachingConnectionFactory делать что-то плохое (кэширование продюсера, который общается со старым сервером?).

Я что-то упустил, что мне нужно сделать здесь?Мои настройки кажутся вполне нормальными, но я не могу найти кого-то еще с этой проблемой.

Ответы [ 2 ]

5 голосов
/ 22 мая 2011

Проблема, с которой я столкнулся, заключается в том, что ActiveMQ не сообщал CachingConnectionFactory, когда он переподключался, поэтому кэшированное соединение все еще использовалось. Я заменил его на ActiveMQ PooledConnectionFactory, и проблема исчезла.

4 голосов
/ 01 марта 2012

Между прочим, я только что протестировал этот сценарий (используя CachingConnectionFactory для соединений между производителем и потребителем) между двумя локальными брокерами AMQ, и отработка отказа работала нормально ...

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

...