java - 在启动/停止 JMS activemq服务器之后,spring JMS将引发 java.io.EOFException,然后不连接正在运行的JMS

  显示原文与译文双语对照的内容

我在 spring 上下文文件中有以下设置。


<bean id="amqPowerConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
 <constructor-arg index="0" value="${power.messagebrokerurl}"/>
</bean>

<bean id="powerConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
 <constructor-arg ref="amqPowerConnectionFactory"/>
</bean>

<bean id="powerEventQueue" class="org.apache.activemq.command.ActiveMQQueue">
 <constructor-arg value="PowerEventQueue"/>
</bean>

<bean id="timeSeriesChangesContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
 <property name="connectionFactory" ref="powerConnectionFactory"/>
 <property name="destination" ref="powerEventQueue"/>
 <property name="messageListener" ref="timeSeriesDataAdapter"/>
 <property name="recoveryInterval" value="5000"/>
</bean>

<bean id="timeSeriesDataAdapter" class="com.sungard.energy.aligne.aligneweb.assetManagement.TimeSeriesMessageAdapter">
 <property name="queueName"><value>"PowerEventQueue"</value></property>
 <property name="messageHandler" ref="timeSeriesMessageHandler"/>
</bean>

<bean id="timeSeriesMessageHandler" class="com.sungard.energy.aligne.aligneweb.assetManagement.TimeSeriesMessageHandler">
</bean>

"$ {power.messagebrokerurl} is是在机器本地运行的tcp://localhost:61616 换句话说,JMS activemq 。

当JMS宕掉时,应用服务器正在监听这个 activemq,应用服务器显示以下消息,因为JMS实际上正在关闭,它正在尝试查看是否每1 秒都在运行。


 WARN DefaultMessageListenerContainer:844 - Setup of JMS message listener invoker failed for destination 'queue://PowerEventQueue' - trying to recover. Cause: The *Consumer* is closed
Could not refresh JMS Connection for destination 'queue://PowerEventQueue' - retrying in 5000 ms. Cause: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect

现在,当我重启我的JMS,应用服务器成功地连接到它并显示以下消息。


INFO DefaultMessageListenerContainer:893 - Successfully refreshed JMS Connection
WARN CachingConnectionFactory:301 - Encountered a JMSException - resetting the underlying JMS Connection

现在,当我再次关闭JMS而不是显示连接被拒绝显示以下消息时。


WARN DefaultMessageListenerContainer:844 - Setup of JMS message listener invoker failed for destination 'queue://PowerEventQueue' - trying to recover. Cause: The Session is closed
INFO CachingConnectionFactory:291 - Established shared JMS Connection: ActiveMQConnection {id=ID:ap-pun-ws0430-53381-1437557704588-0:28,clientId=null,started=false}
ERROR DefaultMessageListenerContainer:909 - Could not refresh JMS Connection for destination 'queue://PowerEventQueue' - retrying in 1000 ms. Cause: The JMS connection has failed: java.io.EOFException

现在即使我启动了JMS服务器,appserver也不会重新连接它,并且持续抛出英镑的

在我观察到,在成功重新连接到JMS之前,日志消息的一部分是: 的消费者

在其他情况下,它说明原因: 的会话已经关闭,并且还处于以下行


INFO CachingConnectionFactory:291 - Established shared JMS Connection: ActiveMQConnection {id=ID:ap-pun-ws0430-53381-1437557704588-0:28,clientId=null,started=false}

时间: 原作者:

power.messagebrokerurl的值设置为


power.messagebrokerurl=tcp://localhost:61616

如果在开始时添加故障转移,我不会看到这个错误。


power.messagebrokerurl=failover:tcp://localhost:61616

更新: 带有 上面 设置,侦听器服务器总是希望在启动时启动并运行 JMS 。 因此,我必须添加的startupMaxReconnectAttempts 属性,值为 1. 默认值为 -1 ( 我正在使用 ActiveMQ 5.5.0 ),表示传输将不限制初始连接尝试数,这就是侦听器服务器不起作用的原因。


power.messagebrokerurl=failover:(tcp://localhost:61616)?startupMaxReconnectAttempts=1

你可以参考 http://activemq.apache.org/failover-transport-reference.html 所有传输选项。

原作者:
...