0

有人遇到过 NanoHttpd 泄漏线程的问题吗?

问题是库为每个传入请求创建一个新线程,当我看到这些请求的响应时,运行请求处理的内部线程从未完成。这导致它最终有数百个泄漏的线程和应用程序崩溃。

我的代码非常基本和简单。我只是将 NanoHTTPD 子类化并覆盖 serve() 方法。

我已经调试了 lib 本身,它在 NanoHTTPD 类中永远循环在以下代码中:

while (!finalAccept.isClosed()) {        
    session.execute();
}

有什么建议么?

更新: 原来这是连接到客户端应用程序的边缘案例,该客户端应用程序向我的启动 http 服务器的应用程序发出请求。当我从 Chrome 或 curl 发出请求时,它不会泄漏任何线程。

4

1 回答 1

1

我相信此泄漏是由于您的客户端未关闭套接字引起的。NanoHttpd 在读取时使用 5 秒的超时,并且仅在客户端关闭套接字时停止服务线程:

第 190 行:

} catch (Exception e) {
    // When the socket is closed by the client, we throw our own SocketException
    // to break the "keep alive" loop above.
    if (!(e instanceof SocketException && "NanoHttpd Shutdown".equals(e.getMessage()))) {
        e.printStackTrace();
    }

}

第 863 行:

if (read == -1) {
    // socket was been closed
    safeClose(inputStream);
    safeClose(outputStream);
    throw new SocketException("NanoHttpd Shutdown");
}

我建议检查您的客户端是否正确关闭连接,并可能编写您自己的AsyncRunner实现而不是DefaultAsyncRunnerNanoHttpd 提供的实现,以限制线程数。除此之外,您还可以实现一种机制来停止线程服务超过 x 秒(30 秒将是一个很好的开始 imo)。

于 2014-02-24T08:18:07.940 回答