2016-01-26 139 views
3

我使用JSch 0.1.50爲我的CI Jenkins插件建立到遠程服務器的連接。假設我想在這裏使用session.connect(60000);在超時60秒:JSch會話超時限制

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; 
} 

但是在這個代碼的連接在執行過程中事實很慢服務器我面臨的超時Exception在約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秒計算的逾原因?

+0

的問題是從服務器端IP配置。該服務器具有配置了連接超時的DMZ IP地址。 –

回答

1

如果檢查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(); 
    } 
} 
+1

我正面臨與SocketFactoryWithTimeout相同的結果。那麼我認爲我們現在會嘗試找到'操作系統級別的默認限制'... Thanx –