Проблема автоматического подключения к ActiveMQ и CachingConnectionFactory

#java #spring #activemq

#java #spring #activemq

Вопрос:

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

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

Ответ №1:

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

Ответ №2:

К вашему сведению, я только что протестировал этот сценарий (используя CachingConnectionFactory как для подключений производителя, так и для подключений потребителя) между двумя локальными брокерами AMQ, и переход на другой ресурс сработал нормально…

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