Spring - JMS,在 JMS activemq 服务器 start/stop 之后,侦听器服务器抛出 java.io.EOFException 然后不连接到 运行 JMS

Spring - JMS , after couple of start/stop of JMS activemq server, listener server throws java.io.EOFException and then does not connect to running 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}" 是 tcp://localhost:61616 即机器上本地的 JMS activemq 运行。

应用服务器正在侦听此 activemq jms,当 jms 关闭时,应用服务器显示以下消息,这是正确的,因为 JMS 实际上已关闭并且它正在尝试每 5 秒查看它是否启动。

    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 服务器时,appserver 不再显示连接被拒绝,而是显示以下消息。

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 也不会重新连接到它并不断抛出 java.io.EOFException

我观察到的是,在成功重新连接到 JMS 之前,部分日志消息说, 原因:Consumer 已关闭

where-as in other case it says 原因:Session 已关闭 还有下面的行

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 启动并 运行 启动。所以我必须添加值为 1 的 startupMaxReconnectAttempts 属性。默认情况下,它的值为 -1(我使用的是 ActiveMQ 5.5.0),这表示传输将没有数量限制初始连接尝试次数,这就是侦听器服务器未启动的原因。

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

您可以参考http://activemq.apache.org/failover-transport-reference.html了解所有交通方式。