JmsListener容器错误处理器未按预期触发异常问题排查
自定义JmsErrorHandler未触发问题
我配置了Spring JMS消息监听器用于持续监听队列,相关Bean配置如下:
<bean id="JmsErrorHandler" class="com.cls.tools.nrbypass.utils.JmsErrorHandler" /> <jms:listener-container connection-factory="mqXAConnectionFactory" destination-type="queue" transaction-manager="jmsTxnManager" acknowledge="transacted" concurrency="1" error-handler="JmsErrorHandler"> <jms:listener destination="$(instance.$(instanceName).input.queue)" ref="messageListener" /> </jms:listener-container>
对应的错误处理器类,目的是在队列名称错误或配置有误时捕获异常并关闭程序:
package com.cls.tools.nrbypass.utils; import org.springframework.jms.JmsException; import org.springframework.stereotype.Service; import org.springframework.util.ErrorHandler; import com.cls.common.launcher.ShutdownUtils; @Service public class JmsErrorHandler implements ErrorHandler { @Override public void handleError(Throwable t) { System.exit(0); } }
但实际运行时,监听器并未停止,而是反复生成以下错误,自定义的JmsErrorHandler完全没被触发:
2025-02-07 15:17:10,433 INFO [main] c.c.s.handler.SignalHandlerUtils [registerSignals] Registering signals 2025-02-07 15:17:15,519 WARN [jmsContainer-1] o.s.j.l.DefaultMessageListenerContainer [handleListenerSetupFailure] Setup of JMS message listener failed for destination 'TEST2.QUEUE' trying to recover. Cause: JMSWMQ2008: Failed to open MQ queue 'TEST2.QUEUE'; nested exception is com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC FAILED') reason '2085' ('MQRC_UNKNOWN_OBJECT_NAME'). com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC FAILED') reason '2085' ('MQRC_UNKNOWN_OBJECT_NAME'). at com.ibm.mq.client.wmq.common.internal.Reason.createException (Reason.java:209) ... 17 common frames omitted Wrapped by: com.ibm.mq.client.jms.DetailedInvalidDestinationException: JMSWMQ2008: Failed to open MQ queue 'TEST2.QUEUE'. at com.ibm.mq.client.wmq.common.internal.Reason.reasonToException (Reason.java:503) at com.ibm.mq.client.wmq.common.internal.Reason.createException (Reason.java:221) at com.ibm.mq.client.wmq.internal.WMQMessageConsumer.checkJmqiCallSuccess (WMQMessageConsumer.java:129) at com.ibm.mq.client.wmq.internal.WMQConsumerShadow.initialize(WMQConsumerShadow.java:976) at com.ibm.mq.client.wmq.internal.WMQSyncConsumerShadow.initialize (WMQSyncConsumerShadow.java:139) at com.ibm.mq.client.wmq.internal.WMQMessageConsumer.<init>(WMQMessageConsumer.java:257) at com.ibm.mq.client.wmq.internal.WMQSession.createConsumer (WMQSession.java:788) at com.ibm.mq.client.jms.internal.JmsSessionImpl.createConsumer (JmsSessionImpl.java:818) at com.ibm.mq.client.jms.internal.JmsSessionImpl.createConsumer (JmsSessionImpl.java:868) at com.ibm.mq.client.jms.internal.JmsQueueSessionImpl.createReceiver (JmsQueueSessionImpl.java:97) at com.ibm.mq.jms.MQQueueSession.createReceiver (MQQueueSession.java:126) at com.ibm.mq.jms.MQQueueSession.createConsumer (MQQueueSession.java:201) at org.springframework.jms.listener.AbstractMessageListenerContainer.createConsumer(AbstractMessageListenerContainer.java:874) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.createListenerConsumer (AbstractPollingMessageListenerContainer.java:225) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.initResourcesIfNecessary (DefaultMessageListenerContainer.java:1264) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener (DefaultMessageListenerContainer.java:12) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoing(DefaultMessageListenerContainer.java:1227) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1120) at java.lang.Thread.run(Thread.java:750)
请问:为何自定义JmsErrorHandler未触发,无法终止报错的监听器?
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

