vertx.setPeriodic函数的时间间隔缩短的问题

问题描述

设置为每5秒向服务器发送一次PING。 最初,每5秒发送一次ping。 自程序启动以来已过去一个月。 当前,ping每秒被发送2-3次到服务器。 “ vertx.setPeriodic”函数中似乎存在一个错误

long[] pID = {0};
pID[0] = vertx.setPeriodic(5000,handler -> {       
    sendHTTP2PING(mapKey,conn);
});

private void sendHTTP2PING(String mapKey,httpconnection conn) {
    conn.ping(pingData,pong -> {
        if(pong.succeeded()) {
            localAddressport = conn.localAddress().port();
            logger.info("[HTTP/2 CLIENT PING] RECEIVED PONG");
        } else {
            logger.info("[HTTP/2 CLIENT PING] DOES NOT RECEIVED PONG...!!!");
            disconnectToServer(mapKey);
        }
    }).closeHandler(ch -> {
        disconnectToServer(mapKey);
    }).exceptionHandler(exh -> {
        disconnectToServer(mapKey);
    });
}

日志文件

2020-10-27 16:13:10 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:10 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:11 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:11 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:11 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:12 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:12 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:13 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:15 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:15 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:16 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:16 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:16 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:17 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:17 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:18 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:20 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

2020-10-27 16:13:20 [vert.x-eventloop-thread-2]-[HTTP / 2客户端PING]未收到PONG ... !!!

解决方法

当然,这可能是一个错误,you could open a new issue指定了Vert.x版本以及任何重现它的方法。

我想指出的是,您的代码不等于“每5秒打印一次消息”。是的,它每5秒安排一次呼叫,但是,仅当删除服务响应或失败时才打印。
意思是,如果您的远程服务器以一些随机延迟响应,您将看到随机延迟甚至乱序的消息。

我建议尝试使用的是setTimer。这样,您将确保不创建出站请求队列。

pID[0] = vertx.setTimer(5000,handler -> {       
    sendHTTP2PING(mapKey,conn);
});

private void sendHTTP2PING(String mapKey,HttpConnection conn) {
    conn.ping(pingData,pong -> {
        if(pong.succeeded()) {
            localAddressPort = conn.localAddress().port();
            logger.info("[HTTP/2 CLIENT PING] RECEIVED PONG");
        } else {
            logger.info("[HTTP/2 CLIENT PING] DOES NOT RECEIVED PONG...!!!");
            disconnectToServer(mapKey);
        }
        vertx.setTimer(5000,handler -> {       
            sendHTTP2PING(mapKey,conn);
        });
    }).closeHandler(ch -> {
        disconnectToServer(mapKey);
    }).exceptionHandler(exh -> {
        disconnectToServer(mapKey);
    });
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...