问题描述
我正在使用JSch 0.1.50为我的CI Jenkins插件建立与远程服务器的连接。让我们假设我在这里使用 session.connect(60000);
超时60秒:
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;
}
但实际上在连接到相当慢的服务器期间执行此代码期间我每次约20秒内面临超时异常
:
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毫秒
76991-55982=21008 msec
有谁知道这20秒的原因是什么超时?
Does anyone know what is the reason for this 20 seconds timeout?
如果你检查如何实现 Util.createSocket
,你会看到超时
仅定义连接的上限,而不是下限,因为 timeout
奇怪地没有传递给基础 Socket
。
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
.
这20秒可能是操作系统级别的默认限制。
Those 20 seconds is probably an OS-level default limit.
To覆盖它,尝试实施并使用。
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)
.
类似:
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();
}
}
这篇关于JSch会话超时限制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!