jmsComponent 来了:在不同的 bean 中设置异常 Listener 有什么区别?

Came jmsComponent: what's the difference setting the exception Listener in different beans?

我用 spring 这样设置了一个 jms 组件:

<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 个 bean 都有 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

我不明白这是如何工作的,请给出一些解释或提示。

org.springframework.jms.connection.CachingConnectionFactory.exceptionListener 设置 org.apache.activemq.ActiveMQConnectionFactory.exceptionListener ,所以这是一样的。

org.apache.camel.component.jms.JmsConfiguration.exceptionListener设置org.springframework.jms.listener.AbstractMessageListenerContainer.exceptionListener

Set the JMS ExceptionListener to notify in case of a JMSException thrown by the registered message listener or the invocation infrastructure.

因此在任何级别上几乎都使用该侦听器,但最好将其设置在 org.apache.camel.component.jms.JmsConfiguration.exceptionListener 级别以由 spring 容器管理。