JSch会话超时限制

11

我正在使用 JSch 0.1.50 建立一个连接到我的 CI Jenkins 插件的远程服务器。假设我试图在此处使用 session.connect(60000); 来设置超时时间为 60 秒:

Session session = null;
try {
    JSch jsch = new JSch();
    if (rsaIdentity != null && !rsaIdentity.equals("")) {
        jsch.addIdentity(rsaIdentity.trim());
    }
    session = jsch.getSession(serverLogin, serverHost, Integer.parseInt(serverPort));
    session.setPassword(getDescriptor().getOpenPassword(encryptedPasswordString));
    session.setConfig("StrictHostKeyChecking", "no"); // not use RSA key

    int timeOut = Integer.parseInt(getDescriptor().getConnectionTimeOut());

    session.connect(60000);

} catch (SocketTimeoutException e) {
    logger.error(e.getMessage());
    return false;
} catch (JSchException e) {
    logger.error(e.getMessage());
    return false;
}

但事实是,在连接到响应速度较慢的服务器时,在执行此代码期间,每次都会在大约20秒左右遇到超时异常

2016-01-25 13:15:55.982 [INFO] Connecting to server: devsrv26:22 as [user] ...
2016-01-25 13:16:16.991 [ERROR] java.net.ConnectException: Connection timed out: connect
2016-01-25 13:16:16.992 com.jcraft.jsch.JSchException: java.net.ConnectException: Connection timed out: connect
2016-01-25 13:16:16.992     at com.jcraft.jsch.Util.createSocket(Util.java:389)
2016-01-25 13:16:16.993     at com.jcraft.jsch.Session.connect(Session.java:215)
2016-01-25 13:16:16.993     at com.mycomp.jenkins.MyPlugin.perform(MyPlugin.java:225)

76991-55982=21008毫秒

有人知道这个20秒超时的原因吗?

1个回答

5
如果您查看Util.createSocket的实现,您会发现timeout仅定义了连接的上限,而没有下限,因为timeout奇怪地未传递给基础Socket
那20秒可能是操作系统级别的默认限制。
要覆盖它,请尝试实现SocketFactory并使用Session.setSocketFactory将其附加到会话中。
在工厂中使用Socket.connect(SocketAddress endpoint, int timeout)
类似于:
public class SocketFactoryWithTimeout implements SocketFactory {
  public Socket createSocket(String host, int port) throws IOException,
                                                           UnknownHostException
  {
    socket=new Socket();
    int timeout = 60000;
    socket.connect(new InetSocketAddress(host, port), timeout);
    return socket;
  }

  public InputStream getInputStream(Socket socket) throws IOException
  {
    return socket.getInputStream();
  }

  public OutputStream getOutputStream(Socket socket) throws IOException
  {
    return socket.getOutputStream();
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接