有没有人遇到NanoHttpd泄漏线程的问题?
问题是库为每个传入请求创建一个新线程,当我看到对这些请求的响应时,运行请求处理的内部线程永远不会完成。这导致它最终有数百个泄露的线程和应用程序崩溃。
我的代码非常简单明了。我只是对NanoHTTPD进行子类化并覆盖serve()方法。
我调试了lib本身,它在NanoHTTPD类中永远循环使用以下代码:
while (!finalAccept.isClosed()) {
session.execute();
}
有什么建议吗?
更新的 原来这是连接到客户端应用程序的边缘情况,该应用程序向启动http服务器的应用程序发出请求。当我从Chrome或curl发出请求时,它不会泄漏任何线程。
答案 0 :(得分: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
实现,而不是NanoHttpd提供的DefaultAsyncRunner
,以限制线程数。除此之外,您还可以实现一种机制来阻止线程服务超过x秒(30秒将是一个很好的开始)。