2014-02-21 72 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秒將是一個很好的開始)。