簡體   English   中英

vertx.setPeriodic function的時間間隔變小的問題

[英]Problem that the time interval of vertx.setPeriodic function decreases

它設置為每 5 秒向服務器發送一次 PING。 最初,每 5 秒發送一次 ping。 項目啟動已經過去了一個月。 目前,每秒向服務器發送 2-3 次 ping。 “vertx.setPeriodic” function 好像有BUG。

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...!!!

當然,這可能是一個錯誤,您可以打開一個新問題,指定 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);
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM