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 验证)。重新启动应用程序可以恢复消费者,但不幸的是,这在生产等方面不是一个可行的解决方案。
其他感兴趣的事实:
- 我们观察到当 JMS 服务器接受 SSL 流量并作为容错对部署时会发生这种情况(尽管这是一个决定性的观察)
- 当消费者宕机时,日志中绝对没有任何指示(比如错误)。
- 我们正在使用 Spring-JMS (4.1.0) 和 TIBCO EMS (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() 等方法。
感谢您的投入,
普拉巴尔
很可能是网络中的某些东西(路由器、防火墙等)正在悄悄地丢弃空闲连接。
虽然不是 JMS 规范的一部分,但大多数供应商都实施了某种心跳机制,以便 client/server 不时交换 ping,以防止网络组件 and/or 检测到此类行为这样的条件。
查看 Tibco 文档以了解如何配置心跳(他们可能称之为其他名称)。
我们已经构建了一个 Spring 启动消息服务,它侦听托管在 TIBCO EMS(企业消息服务)服务器上的 JMS 队列。它是一个相当简单的应用程序,它接收 JMS 消息、进行一些数据操作并更新数据库。
问题是,有时队列中没有 JMS 使用者,并且传入的消息没有得到处理。但是 Spring 启动应用程序已启动并且 运行(由 ps -ef 验证)。重新启动应用程序可以恢复消费者,但不幸的是,这在生产等方面不是一个可行的解决方案。
其他感兴趣的事实:
- 我们观察到当 JMS 服务器接受 SSL 流量并作为容错对部署时会发生这种情况(尽管这是一个决定性的观察)
- 当消费者宕机时,日志中绝对没有任何指示(比如错误)。
- 我们正在使用 Spring-JMS (4.1.0) 和 TIBCO EMS (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() 等方法。
感谢您的投入, 普拉巴尔
很可能是网络中的某些东西(路由器、防火墙等)正在悄悄地丢弃空闲连接。
虽然不是 JMS 规范的一部分,但大多数供应商都实施了某种心跳机制,以便 client/server 不时交换 ping,以防止网络组件 and/or 检测到此类行为这样的条件。
查看 Tibco 文档以了解如何配置心跳(他们可能称之为其他名称)。