我正在玩vertx和vertx-web。我有一个简单的端点,通过无休止的打印产生一个分块响应"你好"一秒一次。
如何检测客户端何时断开连接?尝试写入断开连接的客户端时,Vertx似乎没有抛出异常,并且routingContext.response().closed()
在客户端消失后很长时间内仍然返回false。
这是一个最小的例子,我使用curl作为客户端:
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
HttpServer server = vertx.createHttpServer();
Router router = Router.router(vertx);
router.route("/hello").handler(rc -> {
rc.response().setChunked(true).putHeader("Content-Type", "text/plain");
vertx.setPeriodic(1000, l -> {
if (rc.response().closed()) {
System.out.println("Stopping"); //Doesn't happen
vertx.cancelTimer(l);
}
try {
System.out.println("hello"); // Keeps printing long after the client disconnects
rc.response().write("hello\n");
} catch (Exception e) {
e.printStackTrace(); // Doesn't happen
rc.response().close();
}
});
});
server.requestHandler(router::accept).listen(8080);
}
答案 0 :(得分:2)
这是一个等待Vert.x 3.5.1的解决方案。 我希望它对你有帮助:))
router.route("/hello").handler(rc -> {
rc.response().setChunked(true).putHeader("Content-Type", "text/plain");
final long timer = vertx.setPeriodic(1000, l -> {
try {
System.out.println("hello");
rc.response().write("hello\n");
} catch (Exception e) {
e.printStackTrace();
rc.response().close();
}
});
// Handle close event to cancel the timer
rc.response().closeHandler(evt -> {
System.out.println("Stopping");
vertx.cancelTimer(timer);
});
});
答案 1 :(得分:0)
该问题原来是Vert.x中的一个错误(link)。我使用的是3.5.0版本。它应该在3.5.1中修复。