问题描述
问题与Spring JMS Consumers to a TIBCO EMS Server expire on their own中提到的问题类似,必须重新启动我们的spring boot应用程序才能重新建立连接
以下是我们用于监听器配置的代码段
outfile << std::setprecision(4) << (abs(dataElement.x1 - queryElement.x2) + abs(dataElement.y1 - queryElement.y2)) << ' ';
和连接工厂
public JmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setMaxMessagesPerTask(5);
factory.setConcurrency("5");
return factory;
}
在VPN故障转移期间观察到此问题,我们具有活动和故障转移vpn连接,当VPN交换机切换时,在应用程序端netstat显示已建立连接,但在EMS端netstat指示几分钟后终止连接或找不到连接,表明没有侦听器在EMS结束。
我们正在使用DefaultListnerContainer工厂,该工厂应该在连接终止但无法重新启动服务器的情况下轮询并刷新连接
我们怀疑由于VPN端存在一些配置问题,DefaultListnerContainer无法识别连接已终止并且无法刷新JMS连接。
请告知我是否还有其他参数或属性可以帮助DefaultListnerContainer识别此类情况。
解决方法
如果您查看TIBCO EMS文档:https://docs.tibco.com/pub/ems/8.5.1/doc/html/api/javadoc/com/tibco/tibjms/TibjmsConnectionFactory.html
您会看到有一些参数可以管理重新连接:
setConnAttemptCount(int attempts)
setConnAttemptDelay(int delay)
setConnAttemptTimeout(int timeout)
setReconnAttemptCount(int attempts)
setReconnAttemptDelay(int delay)
setReconnAttemptTimeout(int timeout)
作为示例,您可以使用以下值(延迟和超时以毫秒为单位):
setConnAttemptCount(int attempts) 60
setConnAttemptDelay(int delay) 2000
setConnAttemptTimeout(int timeout) 1000
setReconnAttemptCount(int attempts) 120
setReconnAttemptDelay(int delay) 2000
setReconnAttemptTimeout(int timeout) 1000
您还可以在“连接工厂”定义中定义重新连接参数,例如:
[QueueConnectionFactory]
type = queue
url = tcp://serveur1:7222,tcp://serveur2:7222
connect_attempt_count = 60
connect_attempt_delay = 2000
connect_attempt_timeout = 1000
reconnect_attempt_count = 120
reconnect_attempt_delay = 2000
reconnect_attempt_timeout= 1000
您可以调整参数值以管理将持续很长时间的网络问题。
还请注意,要使EMS客户端库检测到EMS的连接丢失并触发重新连接机制,您需要在EMS tibemsd.conf文件中具有以下参数(持续时间以秒为单位):>
client_heartbeat_server = 20
server_timeout_client_connection = 90
server_heartbeat_client = 20
client_timeout_server_connection = 90
以上方法可以解决您的问题,但我建议您进行测试以调整重新连接参数的值