Spring 启动 JMS DefaultListenerContainer 偶尔会断开连接,并且不会与 Tibco EMS 自动恢复

Spring boot JMS DefaultListenerContainer occasionally drops connection and not autorevocered with Tibco EMS

问题类似于 中提到的问题,必须重新启动我们的 spring 启动应用程序才能重新建立连接

以下是我们用于侦听器配置的代码片段

    public JmsListenerContainerFactory jmsListenerContainerFactory() {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());

        factory.setMaxMessagesPerTask(5);
        factory.setConcurrency("5");
        return factory;
    }

和连接工厂

@Bean
    public ConnectionFactory connectionFactory() {
        ConnectionFactory connectionFactory = null
        Tibjms.setPingInterval(10);
        try {
            TibjmsConnectionFactory tibjmsConnectionFactory = new TibjmsConnectionFactory(
                        environment.getProperty("url"));
            //few more statments to set other properties    
            
        } catch (Exception ex) {
            
        }
        return connectionFactory;
    }

在 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

以上应该可以解决您的问题,但我建议您进行测试以调整重新连接参数的值