2014-02-21 3 views
0

Кто-нибудь столкнулся с проблемой при утечке потоков NanoHttpd?NanoHttpd течет потоки

Дело в том, что библиотека создает новый поток для каждого входящего запроса, и когда я вижу ответ для этих запросов, внутренний поток, который выполнял обработку запросов, никогда не заканчивается. Это приводит к тому, что в конечном итоге у него появилось несколько сотен просочившихся потоков и сбоев приложений.

Мой код довольно простой и простой. Я просто подменю NanoHTTPD и переопределяет метод serve().

Я отлажена сам LIB и петли в следующем коде навсегда в классе NanoHTTPD:

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

Есть предложения?

Update: Оказалось, что это и крайний случай, который связан с клиентским приложением, которое делает запросы в мое приложение, где запущен сервер HTTP. Когда я делаю запросы из Chrome или с помощью curl, он не течет нитями.

+0

Я думаю, что ваш метод serve() необходим для ответа на этот вопрос. –

+0

@PierreRust метод очень прост. Оказалось, что это и кросс-кейс, который подключен к клиентскому приложению, которое делает запросы к моему приложению. Когда я делаю запросы от Chrome или завитки, это не утечка потоков. –

+0

Я думал об этом, ваш клиент, вероятно, не закрывает соединение, когда он закончил с ним. Тогда Nanohttp попытается прочесть в сокете, похоже, что механизм жесткого тайм-аута не выглядит. –

ответ

1

Я считаю, что эта утечка вызвана тем, что ваш клиент не закрывает розетку. NanoHttpd использует тайм-аут 5s на чтение и только останавливает обслуживающую нить, когда сокет был закрыт на стороне клиента:

Line 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(); 
    } 

}

Line 863:

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

Я бы предложил проверить, правильно ли ваш клиент закрывает соединение, и, возможно, написать свою собственную реализацию AsyncRunner вместо DefaultAsyncRunner, предоставленный NanoHttpd, чтобы ограничить количество потоков. Вы могли бы также реализовать, кроме того, механизм остановки потоков, обслуживающих больше, чем x секунд (30 с, было бы хорошим началом imo).

 Смежные вопросы

  • Нет связанных вопросов^_^