Vert.x - 当客户端断开连接时停止分块响应
Vert.x - stop chunked response when client disconnects
我正在研究 vertx 和 vertx-web。我有一个简单的端点,它通过每秒无休止地打印 "hello" 来产生分块响应。
如何检测客户端何时断开连接?尝试写入断开连接的客户端时,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);
}
问题原来是 Vert.x (link) 中的错误。我使用的是 3.5.0 版。它应该在 3.5.1 中修复。
这是等待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);
});
});
我正在研究 vertx 和 vertx-web。我有一个简单的端点,它通过每秒无休止地打印 "hello" 来产生分块响应。
如何检测客户端何时断开连接?尝试写入断开连接的客户端时,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);
}
问题原来是 Vert.x (link) 中的错误。我使用的是 3.5.0 版。它应该在 3.5.1 中修复。
这是等待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);
});
});