Исключения тайм-аута, неожиданно завершающие мой код с JSCH - PullRequest
0 голосов
/ 15 мая 2018

Я использую jsch для отправки файлов. У меня есть этот кусок кода:

public boolean connect()
{ 
    if (_connect()) return true;
    else if (cons_attempts < 3) 
    {
        cons_attempts ++;
        try 
        {
            Thread.sleep(3000);
        } 
        catch (InterruptedException ex){}
        finally
        {
            connect();
        }
    }
    return false;
}

public boolean _connect()
{
    try 
    {
        session = jsch.getSession(user, host, port);
        session.setTimeout(15000);
        session.setConfig("StrictHostKeyChecking","no");

        session.connect();
        Channel channel = session.openChannel("sftp");
        channel.connect(15000);
        sftp = (ChannelSftp) channel;
        return true;
    }
    catch (JSchException ex) 
    {
        MyLogger.log(Level.SEVERE, ex.getMessage());
        return false;
    }
}

Мой код имеет проблемы только с исключениями тайм-аута. До этого я не устанавливал тайм-ауты для jsch, и журнал был:

- java.net.ConnectException: Connexion terminée par expiration du délai d'attente (Тайм-аут соединения)

- пока

При тайм-аутах протоколируется:

- таймаут: сокет не установлен

- пока

Первый тайм-аут на самом деле не моя проблема, но расстраивает то, что я не понимаю, почему моя программа завершает работу после 1 попытки подключения.

За всеми другими исключениями, которые я обнаружил, программа пыталась выполнить это 3 раза Что мне не хватает? В чем причина того, что мой код не пытается подключиться еще 2 раза?

Спасибо

Edit: -Не уверен, что это поможет, но .jar выполняется в .sh, который выполняется заданием cron.

-Также на сервере установлена ​​ОС Debian.

- По словам нашего сетевого парня, наши собственные брандмауэры, похоже, не являются причиной тайм-аута.

1 Ответ

0 голосов
/ 21 мая 2018

, поскольку вы не опубликовали полный код метода, вызывающего метод connect (), я предположил, что вы вызываете метод connect (), который затем вызывает метод _connect (). Тогда, если вы хотите, чтобы код пробовал три попытки, тогда метод connect () должен быть

 public boolean connect(){ 
   int maxAttempt = 3;
   for(int cons_attempts  = 0 ; cons_attempts   < maxAttempt  ; cons_attempts  ++){ 
     if (_connect()) {return true;}
     try 
      {
         Thread.sleep(3000);
      } 
       catch (InterruptedException ex){}
     }
   }
   return false;
 }   
...