【问题标题】:Timeout exceptions ending my code unexpectedly with JSCH超时异常以 JSCH 意外结束我的代码
【发布时间】:2018-05-15 09:06:58
【问题描述】:

我正在使用 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 次的原因是什么?

谢谢

编辑: - 不确定它是否会有所帮助,但 .jar 在 .sh 中执行,该 .sh 由 cron 作业执行。

-服务器的操作系统也是Debian。

-根据我们的网络人员,我们自己的防火墙似乎不是超时的原因。

【问题讨论】:

    标签: java recursion networking timeout jsch


    【解决方案1】:

    由于您没有发布调用 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;
     }   
    

    【讨论】:

    • 我只是从我的 mainish 中调用我的 connect() 方法。我不认为问题出在代码逻辑中,因为它适用于所有类型的与超时无关的异常。不过谢谢
    • 好的!但是上面的代码将循环直到达到 maxAttempt ,如果 _connect() 没有返回 true ,这将使代码调用 _connect() 进行一些 maxAttempt 。
    • 是的,我看到了,但是如果连接失败,我的代码已经循环了 3 次,除非尝试达到超时限制(来自 JSCH 的那个或来自我的 sshd 的那个)在这种情况下我的连接( ) 方法仅在一次尝试后返回 false。 “for 循环”的行为有何不同?
    • R 巴约。由于您使用的是 sftp 协议,我认为您的代码也需要捕获 SftpException!尝试添加另一个捕获 SftpException 的 catch 子句,你会没事的!相信对你有用
    • O-m-g 你是对的。我不敢相信我没有看到我只是抓住了那些。如果您愿意,请编辑您的答案,我会接受。非常感谢。当错误再次发生时我会更新以验证 3 次尝试,但我毫不怀疑它不会
    猜你喜欢
    • 2018-07-17
    • 2018-03-11
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多