JSch会话超时限制

时间:2016-01-26 07:47:57

标签: java session jenkins timeout jsch

我正在使用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秒内面临超时Exception

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 个答案:

答案 0 :(得分:2)

如果您检查ID YEAR MONTH CONSDATE CONSKG 1 2015 1 2015-01-01 10 1 2015 1 2015-01-02 20 1 2015 1 2015-01-03 30 1 2015 1 2015-01-31 310 1 2015 2 2015-02-01 10 1 2015 2 2015-02-02 20 1 2015 2 2015-02-03 30 的实施方式,您会看到Util.createSocket仅定义了连接的上限,而不是下限,因为timeout奇怪的不是传递给基础timeout

这20秒可能是操作系统级别的默认限制。

要覆盖它,请尝试实施SocketFactory并使用Session.setSocketFactory将其附加到会话。

在工厂中使用Socket.connect(SocketAddress endpoint, int timeout)

类似的东西:

Socket