したがって、Springスタックを実行しているTomcatサーバー(tomcat6)があります。スタックの一部として、メッセージの処理に使用しているActiveMQ組み込みサーバーがあります。私は次のように私の春のコンテキストでブローカーを構成しました:
<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"
p:brokerURL="tcp://localhost:61616" />
<bean id="jmsCachedConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory"
p:targetConnectionFactory-ref="jmsConnectionFactory"
p:sessionCacheSize="100" />
<amq:broker id="broker" useJmx="false" persistent="false">
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:61616" />
</amq:transportConnectors>
</amq:broker>
<bean id="jmsDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="EDS.PUSHES" />
</bean>
<bean id="jmsMessageProducerTemplate" class="org.springframework.jms.core.JmsTemplate"
p:connectionFactory-ref="jmsCachedConnectionFactory"
p:defaultDestination-ref="jmsDestination" />
<jms:listener-container container-type="default"
connection-factory="jmsCachedConnectionFactory" task-executor="pollingExecutor"
acknowledge="auto" prefetch="5" destination-type="queue" cache="none" concurrency="50-100">
<jms:listener destination="EDS.PUSHES" ref="pushMessageConsumer" method="onMessage" />
</jms:listener-container>
pushMessageConsumerは、onMessageメソッドを介してキューからメッセージを読み取る私のクラスです。
定期的に、jmsサーバーはEOF例外を報告します。
012-08-09 14:50:02,891 [ActiveMQ Connection Executor: tcp://localhost/127.0.0.1:61616]
WARN org.springframework.jms.connection.CachingConnectionFactory - Encountered a
JMSException - resetting the underlying JMS Connection
javax.jms.JMSException: java.io.EOFException
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49)
at org.apache.activemq.ActiveMQConnection.onAsyncException(ActiveMQConnection.java:1841)
at org.apache.activemq.ActiveMQConnection.onException(ActiveMQConnection.java:1858)
at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
at org.apache.activemq.transport.ResponseCorrelator.onException(ResponseCorrelator.java:126)
at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
at org.apache.activemq.transport.WireFormatNegotiator.onException(WireFormatNegotiator.java:160)
at org.apache.activemq.transport.InactivityMonitor.onException(InactivityMonitor.java:265)
at org.apache.activemq.transport.TransportSupport.onException(TransportSupport.java:96)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:206)
at java.lang.Thread.run(Thread.java:679)
Caused by: java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:392)
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:269)
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:227)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:219)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:202)
... 1 more
2012-08-09 14:50:02,908 [pollingExecutor-4] WARN
org.springframework.jms.listener.DefaultMessageListenerContainer - Setup of JMS
message listener invoker failed for destination 'EDS.PUSHES' - trying to recover.
Cause: The Session is closed
次に、Tomcatを再起動し、アプリケーション全体を再起動します。ブローカー定義を変更し、DefaultIOExceptionHandlerを使用してBeanを追加することにより、ioExceptionHandlerを追加してみました。
<bean id="ioExceptionHandler" class="org.apache.activemq.util.DefaultIOExceptionHandler">
<property name="ignoreAllErrors"><value>true</value></property>
</bean>
<amq:broker id="broker" useJmx="false" persistent="false"
ioExceptionHandler="#ioExceptionHandler">
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:61616" />
</amq:transportConnectors>
</amq:broker>
ただし、EOF例外が発生した場合は、引き続きTomcatサーバーを再起動します。構成に何かが欠けていますか?