2014-02-21 71 views
0

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

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

我的代码非常基本和直接。我只是subcllass NanoHTTPD和覆盖serve()方法。

我调试的lib本身和它下面的代码循环永远在NanoHTTPD类:

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

有什么建议?

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

+0

我认为你的serve()方法的实现需要回答这个问题。 –

+0

@PierreRust方法很简单。原来,这是连接到向我的应用程序发出请求的客户端应用程序的边缘案例。当我从Chrome或curl发出请求时,它不会泄露线程。 –

+0

我想到了这一点,您的客户可能在完成连接时没有关闭连接。然后Nanohttp会循环尝试读取套接字,它似乎没有硬超时机制。 –

回答

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实现而不是DefaultAsyncRunner由NanoHttpd提供,以限制线程数量。除此之外,你还可以实现一个机制来阻止线程服务超过x秒(30秒将是一个很好的开始)。