Spring TIBCO EMS 服务器的 JMS 消费者自行过期

Spring JMS Consumers to a TIBCO EMS Server expire on their own

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

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

其他感兴趣的事实:

实例化 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 端设置额外的日志记录,但我们想检查一些要点,例如:

感谢您的投入, 普拉巴尔

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

虽然不是 JMS 规范的一部分,但大多数供应商都实施了某种心跳机制,以便 client/server 不时交换 ping,以防止网络组件 and/or 检测到此类行为这样的条件。

查看 Tibco 文档以了解如何配置心跳(他们可能称之为其他名称)。