Что может привести к зависанию потока, получающего вывод из канала JSch, при печати этого вывода - PullRequest
0 голосов
/ 20 августа 2011

Недавно я обнаружил проблему с печатью большого количества текста через Jsch channel.getInputStream ().

, используя этот код:

outputStream_from_outputChannel = channel.getInputStream();
br = new BufferedReader(new InputStreamReader(outputStream_from_outputChannel));
while ( (line = br.readLine()) != null ){
    System.out.println(line);
    numOfLines++;
}

... иногда (большинство извремя) Я получу результаты обратно, но иногда он перестает производить распечатку без возврата, то есть печать останавливается посередине и нить зависает.Как вы думаете, это может быть связано?До сих пор я узнал, что это не сеанс jsch, который является тайм-аутом.Время ожидания равно 0. Кто-нибудь сталкивался с этим раньше?

Ответы [ 2 ]

0 голосов
/ 17 мая 2017

Иногда чтение из входного потока канала зависает, если удаленный сервер перестает отвечать (по таким причинам, как сетевое подключение, перегрузка и т. Д.), Но потоковые методы readline блокируются навсегда. Решение проблемы состоит в том, чтобы установить интервал активности сервера, используя:

session.setServerAliveInterval(int milliseconds);

Он будет отправлять транзитные пакеты для проверки возможности подключения после указанного интервала времени. И readline вернется, если от сервера не будет получен ответ при проверке подключения.

0 голосов
/ 03 августа 2012

Сначала нужно проверить, готов ли поток \ доступен:

byte[] tmp = new byte[1024];
while (outputStream_from_outputChannel.available() > 0) {
    int i = is.read(tmp, 0, 1024);
    if (i < 0)
        break;
    someStrBuff.append(new String(tmp, 0, i));
}
...