首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以设置默认的全局Java套接字超时?

是否可以设置默认的全局Java套接字超时?
EN

Stack Overflow用户
提问于 2016-06-18 05:21:49
回答 2查看 10.1K关注 0票数 3

我遇到了一个问题,我的应用程序中涉及http和ftp连接的各个地方在java.net.SocketInputStream.socketRead0上无限期地挂起(在终止java进程之前观察了几个小时)。

我希望全局覆盖默认的0套接字超时,这样我就不必在发起连接的每个位置都设置它。是否有一些全局Java属性或方法可以调用,以将默认套接字超时设置为0以外的值?

EN

回答 2

Stack Overflow用户

发布于 2018-10-14 04:34:09

这取决于您的应用程序如何创建套接字。如果您的应用程序代码使用URLConnection,那么您可以使用JVM属性设置默认超时:

代码语言:javascript
复制
-Dsun.net.client.defaultReadTimeout=30000
-Dsun.net.client.defaultConnectTimeout=5000

这些属性是特定于实现的,但仍然适用于最新的Oracle/OpenJDK。

https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html

票数 5
EN

Stack Overflow用户

发布于 2016-06-18 05:41:59

这取决于您是如何编写代码的。从我的角度来看,您应该已经创建了一个APIClient,它负责进行http/ftp调用并将响应返回给调用者函数。也就是说,每个http/ftp调用都必须经过这个APIClient文件。最好有一个类参数/常量,它以毫秒为单位存储超时时间,然后在进行http/ftp调用时使用这个常量作为超时时间。

代码语言:javascript
复制
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;
}

}

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37890552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档