3

问题类似于Spring JMS Consumers to a TIBCO EMS Server 中提到的问题自行过期,并且必须重新启动我们的 Spring Boot 应用程序以重新建立连接

下面是我们用于监听器配置的代码片段

    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 识别此类情况。

4

1 回答 1

1

如果您查看 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

您还可以在 Connection Factory 定义中定义重新连接参数,例如:

[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

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

于 2020-11-03T10:14:17.650 回答