【发布时间】:2021-03-09 19:29:14
【问题描述】:
我有一个 Spring Boot 2.1.4 应用程序,它使用 DefaultJmsListenerContainerFactory 通过 SSL 使用来自 IBM MQ 9.0 的消息。我注意到在某些未知情况下,侦听器与 MQ 的连接仍然存在,并且在日志记录和 MQ 资源管理器中报告为已连接,但是侦听器不使用消息,并且它们保留在队列中,直到 Spring Boot 应用程序重新启动。日志不会在应用程序或队列管理器中报告任何内容。
理想情况下,我希望JmsListener 能够识别失败状态并自行重新连接。我已经阅读了在 MQ 上配置 Heartbeat 或 Keep Alive 并且客户端会有所帮助。 MQ 通道设置为 5 秒的心跳间隔,但不确定如何在 Spring Boot 应用中配置此设置或保持活动状态。
注意:如果 MQ 连接发生异常,我的 JmsListener 会自行重新连接。
Jms 工厂代码:
@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory defaultJmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
defaultJmsListenerContainerFactory.setTransactionManager(jmsTransactionManager(connectionFactory));
defaultJmsListenerContainerFactory.setSessionTransacted(true);
defaultJmsListenerContainerFactory.setSessionAcknowledgeMode(Session.SESSION_TRANSACTED);
defaultJmsListenerContainerFactory.setErrorHandler(new DefaultJmsErrorHandler());
defaultJmsListenerContainerFactory.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE);
configurer.configure(defaultJmsListenerContainerFactory, connectionFactory);
return defaultJmsListenerContainerFactory;
}
听众:
@JmsListener(destination = "${sys.to.app.core.queue}", containerFactory = "myFactory")
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void onMessageReceived(final Message message) throws InboundQueueMessageException {...}
【问题讨论】:
-
您能分享任何您认为可以帮助我们的代码吗?
-
除非您在 spring 端使用 CCDT,否则 HBINT 将协商 SVRCONN 的值。但是根据您的描述,听起来您并没有断开连接。您使用的是哪个版本的 IBM MQ jar 文件?队列管理器的完整版是什么?
-
可能是
ibm.mq.pool.timeBetweenExpirationCheck。见github.com/ibm-messaging/mq-jms-spring -
在一些较旧的维护级别中存在一些死锁。
-
@JoshMc IBM MQ jar 9.0.4,Spring JMS jar:5.1.6,IBM MQ jar:9.0.2,IBM MQ Manager:9.1.0.5
标签: java ibm-mq spring-jms