我遇到了一个问题,我的应用程序涉及http和ftp连接的各个地方在java.net.SocketInputStream.socketRead0上无限期地挂起(在杀死java进程之前一次观察几个小时)。
我希望全局覆盖默认套接字超时0,这样我就不必在我发起连接的每个位置设置它。是否有一些全局Java属性或方法可以调用以将默认套接字超时设置为0以外的其他值?
答案 0 :(得分:0)
这取决于您的应用程序如何创建套接字。如果您的应用程序代码使用URLConnection,则可以使用JVM属性设置默认超时:
-Dsun.net.client.defaultReadTimeout=30000
-Dsun.net.client.defaultConnectTimeout=5000
此属性是特定于实现的,但仍适用于最新的Oracle / OpenJDK。
https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html
答案 1 :(得分:-1)
这取决于你如何编写代码。从我的角度来看,你应该创建一个APIClient,它负责进行http / ftp调用并将响应返回给调用者函数。 也就是说,每个http / ftp调用都必须通过此APIClient文件。最好有一个类参数/常量,以ms为单位存储超时,然后在进行http / ftp调用时将此常量用作超时。
public abstract class WebServiceAPIClient {
protected String authUser;
protected String authPassword;
// Set the connection timeout whatever you want...
final Integer connectionTimeOut = 60000;
public WebServiceAPIClient(String user, String pwd, int errorCode) {
this.authUser = user;
this.authPassword = pwd;
this.errorIdentiferCode = errorCode;
}
public String requestRESTGet(String url, List<Integer> successCodes, boolean addBasicAuth) throws CloudWebServiceInvocationException {
Long start = System.currentTimeMillis();
HttpGet get = new HttpGet(url);
DefaultHttpClient client = getHttpClient();
try {
if (addBasicAuth)
addHeaders(get);
HttpResponse response = client.execute(get);
return responseAsString(response);
} catch (ClientProtocolException e) {
internalServerError(e);
} catch (IOException e) {
internalServerError(e);
} finally {
client.getConnectionManager().shutdown();
}
return "";
}
protected DefaultHttpClient getHttpClient() {
DefaultHttpClient client = new DefaultHttpClient();
HttpParams params = client.getParams();
if (this.connectionTimeOut != null) {
HttpConnectionParams.setConnectionTimeout(params, this.connectionTimeOut);
HttpConnectionParams.setSoTimeout(params, 3 * this.connectionTimeOut);
}
return client;
}
}