Spring boot TIBCO EMS服务器的Spring JMS使用者将自行过期

Spring boot TIBCO EMS服务器的Spring JMS使用者将自行过期,spring-boot,spring-jms,tibco-ems,Spring Boot,Spring Jms,Tibco Ems,我们构建了一个Spring引导消息传递服务,该服务侦听托管在TIBCO EMS(企业消息传递服务)服务器上的JMS队列。它是一个相当简单的应用程序,可以接收JMS消息、执行一些数据操作并更新数据库 问题是,队列上偶尔没有JMS使用者,传入的消息不会被处理。但是,Spring Boot应用程序已启动并正在运行(由ps-ef验证)。重新启动应用程序可以恢复消费者,但不幸的是,这在生产等方面不是一个可行的解决方案 其他相关事实: 我们已经观察到,当JMS服务器接受SSL通信并作为容错对部署时,会发生

我们构建了一个Spring引导消息传递服务,该服务侦听托管在TIBCO EMS(企业消息传递服务)服务器上的JMS队列。它是一个相当简单的应用程序,可以接收JMS消息、执行一些数据操作并更新数据库

问题是,队列上偶尔没有JMS使用者,传入的消息不会被处理。但是,Spring Boot应用程序已启动并正在运行(由ps-ef验证)。重新启动应用程序可以恢复消费者,但不幸的是,这在生产等方面不是一个可行的解决方案

其他相关事实:

  • 我们已经观察到,当JMS服务器接受SSL通信并作为容错对部署时,会发生这种情况(尽管这是一个有冲击性的观察结果)
  • 当消费者停机时,日志中绝对没有任何指示(如错误)
  • 我们正在使用SpringJMS(4.1.0)和TibcoEMS(8.3.0)
实例化DefaultJmsListenerContainerFactory的代码片段:

@Bean
public DefaultJmsListenerContainerFactory listenerJmsContainerFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    TibjmsQueueConnectionFactory cf = new TibjmsQueueConnectionFactory("tcp://localhost:7222");
    cf.setUserName("admin");
    cf.setUserPassword("");
    factory.setConnectionFactory(cf);
    return factory;
}
JMS侦听器:

@JmsListener(destination = "queue.sample", containerFactory = "listenerJmsContainerFactory")
public void listen(TextMessage message, Session session) throws JMSException{
    System.out.println("Received Message: "+message.getJMSMessageID());
    System.out.println("Acknowledgement Mode: "+session.getAcknowledgeMode());
// Some more application specific stuff
}
当我们试图在Spring Boot和TIBCO端设置其他日志记录时,我们想检查以下几点:

  • 消费者闲置超过一定时间后是否会自动过期
  • 这是由DMLC设置(如idleConsumerLimit、idleTaskExecutionLimit等)控制的吗
  • 可以在上面提到的Spring引导代码中查看这些属性吗?例如,在上面的代码中,JMS侦听器是由DefaultJmsListenerContainerFactory在后台创建的。那么,我们如何访问DMLC对象,以便调用诸如getIdleConsumerLimit()、getIdleTaskExecutionLimit()等方法呢
谢谢你的投入,
Prabal

最有可能的是,网络中的某些东西(路由器、防火墙等)正在悄悄地丢弃空闲连接

虽然不是JMS规范的一部分,但大多数供应商实现了某种心跳机制,以便客户机/服务器不时进行ping交换,以防止网络组件执行此类操作和/或检测此类情况

查看Tibco文档,了解如何配置心跳(他们可能会称之为其他内容)