2017-07-11 32 views
0

我設置了這樣的方式春天JMS組件:Came jmsComponent:在不同的bean中設置異常Listener有什麼區別?

<bean id="jmsConnectionFactory" 
     class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="tcp://localhost:61616" /> 
</bean> 
<bean id="cachedConnectionFactory" 
     class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <property name="targetConnectionFactory" ref="jmsConnectionFactory"/> 
    <property name="sessionCacheSize" value="10"/> 
    <property name="exceptionListener" ref="exceptionListener"/> 
</bean> 
<bean id="jmsConfig" 
     class="org.apache.camel.component.jms.JmsConfiguration"> 
    <property name="connectionFactory" ref="cachedConnectionFactory"/> 
    <property name="concurrentConsumers" value="10"/> 

</bean> 

我注意到,所有這些4種豆的ExceptionListener財產。所以我想知道在不同的bean中設置exceptionListener有什麼不同。

在我的測試中,只有在CachingConnectionFactory中的設置可以工作,它可以進入我的ExceptionListener,而在其他情況下,異常會記錄在其他地方,但無法進入我的代碼,異常如下所示。

WARN CachingConnectionFactory.onException(322) - Encountered a JMSException - resetting the underlying JMS Connection 
javax.jms.JMSException: java.io.EOFException 
    at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:54) 
    at org.apache.activemq.ActiveMQConnection.onAsyncException(ActiveMQConnection.java:1983) 
    at org.apache.activemq.ActiveMQConnection.onException(ActiveMQConnection.java:2002) 
    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.AbstractInactivityMonitor.onException(AbstractInactivityMonitor.java:314) 
    at org.apache.activemq.transport.TransportSupport.onException(TransportSupport.java:96) 
    at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:200) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.io.EOFException 
    at java.io.DataInputStream.readInt(DataInputStream.java:392) 
    at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275) 
    at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221) 
    at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213) 
    at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) 
    ... 1 more 

我不明白這是如何工作的,請給出一些解釋或提示。

回答

0

org.springframework.jms.connection.CachingConnectionFactory.exceptionListener設置org.apache.activemq.ActiveMQConnectionFactory.exceptionListener,所以這是一樣的。

org.apache.camel.component.jms.JmsConfiguration.exceptionListener成立org.springframework.jms.listener.AbstractMessageListenerContainer.exceptionListener

設置JMS的ExceptionListener在由註冊的消息監聽器或調用基礎設施拋出那麼JMSException 的情況下通知。

因此,它幾乎與任何級別的偵聽器使用相同,但最好將其設置在org.apache.camel.component.jms.JmsConfiguration.exceptionListener級別,以便由spring Container進行管理。

相關問題