问题
I'm using JSch 0.1.50 to set up a connection to the remote server for my CI Jenkins plugin. Let's assume I'm trying to use here session.connect(60000);
for the timeout 60 sec:
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;
}
But in fact during the execution of this code during the connection to pretty slow sever I'm facing the timeout Exception
in approximately 20 seconds every time:
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 msec
Does anyone know what is the reason for this 20 seconds timeout?
回答1:
If you check how the Util.createSocket
is implemented, you will see that the timeout
defines an upper limit of the connection only, not a lower limit, because the timeout
is strangely not passed to an underlying Socket
.
Those 20 seconds is probably an OS-level default limit.
To override it, try implementing the SocketFactory and attach it to the session using the Session.setSocketFactory.
In the factory use the Socket.connect(SocketAddress endpoint, int timeout).
Something like:
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();
}
}
来源:https://stackoverflow.com/questions/35009009/jsch-session-timeout-limit