有人遇到NanoHttpd泄漏线程的问题了吗?
问题是,库为每个传入请求创建一个新线程,当我看到这些请求的响应时,运行请求的内部线程从未完成。这最终导致了数百条泄露的线程和应用程序崩溃。
我的代码非常简单和简单。我只是子类NanoHTTPD和重写serve()方法。
我已经在NanoHTTPD类中调试了库本身,并且它在下面的代码中一直循环:
while (!finalAccept.isClosed()) {
session.execute();
}有什么建议吗?
更新:原来这是和边缘的情况,是连接到客户端应用程序,提出请求,我的应用程序,http服务器是启动。当我从Chrome或curl发出请求时,它不会泄漏任何线程。
发布于 2014-02-24 08:18:07
我相信这次泄漏是你的客户不关闭插座造成的。NanoHttpd在读取时使用5s的超时,并且只有在客户端关闭套接字时才停止服务线程:
第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秒将是一个好的开始,imo)。
https://stackoverflow.com/questions/21936394
复制相似问题