java - ActiveMQ 和 CachingConnectionFactory 的自动重新连接问题

标签 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 是否在做坏事(缓存与旧服务器对话的生产者?)。

我是否遗漏了我需要在这里做的事情?我的设置看起来很正常,但我找不到其他人有这个问题。

最佳答案

我遇到的问题是 ActiveMQ 在重新连接时没有通知 CachingConnectionFactory,因此缓存的连接仍在使用。我用 ActiveMQ 的 PooledConnectionFactory 替换了它,问题就消失了。

关于java - ActiveMQ 和 CachingConnectionFactory 的自动重新连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5916638/

相关文章:

java - activeMq tcp 故障转移时如何处理连接失败

apache-kafka - 何时使用 Apache kafka 而不是 ActiveMQ

bash - ActiveMQ 命令行 : publish messages to a queue from a file?

java - 创建两个 BufferedReader 会关闭输入流吗?

java - springrabbitmq和UI层或托管bean

java - 无法转换为 ThreadPoolTask​​Executor

spring - 如何在 r2dbc 中批量执行多个插入?

java - 在 Coldfusion 9 上使用 cflock 排队

java - 合并排序算法有问题

Java同步和访问静态字段的静态同步方法