2011-05-06 3 views
5

ActiveMQ 및 Spring의 CachingConnectionFactory에 문제가 있습니다. 나는이처럼을 설정 해요 : ActiveMQ 및 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 뭔가 나쁜 일을 할 수도 궁금하네요 (예전 서버와 대화하는 제작자를 캐싱합니까?).

내가 여기서해야 할 일이 누락 되었습니까? 내 설정이 정상적으로 보였지만이 문제가있는 사람을 찾을 수 없습니다.

답변

5

문제는 ActiveMQ가 다시 연결했을 때 CachingConnectionFactory을 말하지 않아서 캐시 된 연결이 계속 사용되고 있다는 것입니다. ActiveMQ의 PooledConnectionFactory으로 바꿔서 문제가 없어졌습니다.

3

참고로, 난 그냥이 지역 AMQ 브로커와 장애 사이 (두 생산자/소비자 연결 CachingConnectionFactory 사용)이 시나리오를 테스트는

말했다되고 있음을

... 내가 다른 소비자를보고 있어요 ... 괜찮 았는데 폴링 소비자 패턴을 사용할 때 연결 문제는 ... 연결을 수동으로 닫아야합니다.