Java x-在客户端断开连接时停止分块响应

Java x-在客户端断开连接时停止分块响应,java,http,vert.x,chunked-encoding,Java,Http,Vert.x,Chunked Encoding,我在玩vertx和VertXWeb。我有一个简单的端点,它通过每秒无休止地打印一次“hello”来生成分块响应 如何检测客户端何时断开连接?当尝试写入断开连接的客户端时,Vertx似乎不会引发异常,routingContext.response().closed()在客户端离开很久之后一直返回false 下面是一个简单的示例,我使用curl作为客户端: public static void main(String[] args) { Vertx vertx = Vertx.vertx()

我在玩vertx和VertXWeb。我有一个简单的端点,它通过每秒无休止地打印一次“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()中的一个bug。我使用的是3.5.0版。它应该在3.5.1中修复。

这个问题原来是Vert.x()中的一个bug。我使用的是3.5.0版。它应该在3.5.1中修复。

下面是等待Vert.x 3.5.1的解决方案。 我希望这对你有帮助:)


下面是等待Vert.x 3.5.1的解决方案。 我希望这对你有帮助:)


似乎您应该在适当的时候结束响应:
rc.response().end()
@nosequence无休止的分块响应有合法的用途。此外,这也是Vert.x中的一个bug。似乎您应该在适当的时候结束响应:
rc.response().end()
@nosequence无休止的分块响应有合法的用途。而且,它原来是Vert.x中的一个bug。
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);
    });
});